微服務(Microservices)和服務網格(Service Mesh)架構概念整理

来源:https://www.cnblogs.com/xishuai/archive/2018/03/20/microservices-and-service-mesh.html
-Advertisement-
Play Games

註:文章內容為摘錄性文字,自己閱讀的一些筆記,方便日後查看。 微服務(Microservices) 在過去的 2016 年和 2017 年,微服務技術迅猛普及,和容器技術一起成為這兩年中最吸引眼球的技術熱點。而以 Spring Cloud 為代表的傳統侵入式開發框架,占據著微服務市場的主流地位。 微 ...


註:文章內容為摘錄性文字,自己閱讀的一些筆記,方便日後查看。

微服務(Microservices)

在過去的 2016 年和 2017 年,微服務技術迅猛普及,和容器技術一起成為這兩年中最吸引眼球的技術熱點。而以 Spring Cloud 為代表的傳統侵入式開發框架,占據著微服務市場的主流地位。

微服務(Microservices)是一種架構風格,一個大型複雜軟體應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是松耦合的。每個微服務僅關註於完成一件任務並很好地完成該任務。在所有情況下,每個任務代表著一個小的業務能力。

形像一點來說,微服務架構就像搭積木,每個微服務都是一個零件,並使用這些零件組裝出不同的形狀。通俗來說,微服務架構就是把一個大系統按業務功能分解成多個職責單一的小系統,並利用簡單的方法使多個小系統相互協作,組合成一個大系統。

如果學科派一點,微服務架構就是把因相同原因而變化的功能聚合到一起,而把因不同原因而變化的功能分離開,並利用輕量化機制(通常為 HTTP RESTful API)實現通信。

微服務架構 ≈ 模塊化開發 + 分散式計算。

需要註意的是“微服務”與“微服務架構”是有本質區別的。“微服務”強調的是服務的大小,它關註的是某一個點。而“微服務架構”則是一種架構思想,需要從整體上對軟體系統進行通盤的考慮。

微服務架構示意圖:

常見的微服務組件及概念:

  • 服務註冊:服務提供方將自己調用地址註冊到服務註冊中心,讓服務調用方能夠方便地找到自己。
  • 服務發現:服務調用方從服務註冊中心找到自己需要調用的服務的地址。
  • 負載均衡:服務提供方一般以多實例的形式提供服務,負載均衡功能能夠讓服務調用方連接到合適的服務節點。並且,節點選擇的工作對服務調用方來說是透明的。
  • 服務網關:服務網關是服務調用的唯一入口,可以在這個組件是實現用戶鑒權、動態路由、灰度發佈、A/B 測試、負載限流等功能。
  • 配置中心:將本地化的配置信息(properties, xml, yaml 等)註冊到配置中心,實現程式包在開發、測試、生產環境的無差別性,方便程式包的遷移。
  • API 管理:以方便的形式編寫及更新 API 文檔,並以方便的形式供調用者查看和測試。
  • 集成框架:微服務組件都以職責單一的程式包對外提供服務,集成框架以配置的形式將所有微服務組件(特別是管理端組件)集成到統一的界面框架下,讓用戶能夠在統一的界面中使用系統。
  • 分散式事務:對於重要的業務,需要通過分散式事務技術(TCC、高可用消息服務、最大努力通知)保證數據的一致性。
  • 調用鏈:記錄完成一個業務邏輯時調用到的微服務,並將這種串列或並行的調用關係展示出來。在系統出錯時,可以方便地找到出錯點。
  • 支撐平臺:系統微服務化後,系統變得更加碎片化,系統的部署、運維、監控等都比單體架構更加複雜,那麼,就需要將大部分的工作自動化。現在,可以通過 Docker 等工具來中和這些微服務架構帶來的弊端。 例如持續集成、藍綠發佈、健康檢查、性能健康等等。嚴重點,以我們兩年的實踐經驗,可以這麼說,如果沒有合適的支撐平臺或工具,就不要使用微服務架構。

微服務架構的優點:

  • 降低系統複雜度:每個服務都比較簡單,只關註於一個業務功能。
  • 松耦合:微服務架構方式是松耦合的,每個微服務可由不同團隊獨立開發,互不影響。
  • 跨語言:只要符合服務 API 契約,開發人員可以自由選擇開發技術。這就意味著開發人員可以採用新技術編寫或重構服務,由於服務相對較小,所以這並不會對整體應用造成太大影響。
  • 獨立部署:微服務架構可以使每個微服務獨立部署。開發人員無需協調對服務升級或更改的部署。這些更改可以在測試通過後立即部署。所以微服務架構也使得 CI/CD 成為可能。
  • Docker 容器:和 Docker 容器結合的更好。
  • DDD 領域驅動設計:和 DDD 的概念契合,結合開發會更好。

微服務架構的缺點:

  • 微服務強調了服務大小,但實際上這並沒有一個統一的標準:業務邏輯應該按照什麼規則劃分為微服務,這本身就是一個經驗工程。有些開發者主張 10-100 行代碼就應該建立一個微服務。雖然建立小型服務是微服務架構崇尚的,但要記住,微服務是達到目的的手段,而不是目標。微服務的目標是充分分解應用程式,以促進敏捷開發和持續集成部署。
  • 微服務的分散式特點帶來的複雜性:開發人員需要基於 RPC 或者消息實現微服務之間的調用和通信,而這就使得服務之間的發現、服務調用鏈的跟蹤和質量問題變得的相當棘手。
  • 分區的資料庫體系和分散式事務:更新多個業務實體的業務交易相當普遍,不同服務可能擁有不同的資料庫。CAP 原理的約束,使得我們不得不放棄傳統的強一致性,而轉而追求最終一致性,這個對開發人員來說是一個挑戰。
  • 測試挑戰:傳統的單體WEB應用只需測試單一的 REST API 即可,而對微服務進行測試,需要啟動它依賴的所有其他服務。這種複雜性不可低估。
  • 跨多個服務的更改:比如在傳統單體應用中,若有 A、B、C 三個服務需要更改,A 依賴 B,B 依賴 C。我們只需更改相應的模塊,然後一次性部署即可。但是在微服務架構中,我們需要仔細規劃和協調每個服務的變更部署。我們需要先更新 C,然後更新 B,最後更新 A。
  • 部署複雜:微服務由不同的大量服務構成。每種服務可能擁有自己的配置、應用實例數量以及基礎服務地址。這裡就需要不同的配置、部署、擴展和監控組件。此外,我們還需要服務發現機制,以便服務可以發現與其通信的其他服務的地址。因此,成功部署微服務應用需要開發人員有更好地部署策略和高度自動化的水平。
  • 總的來說(問題和挑戰):API Gateway、服務間調用、服務發現、服務容錯、服務部署、數據調用。

不過,現在很多微服務的框架(比如 Spring Cloud、Dubbo)已經很好的解決了上面的問題。

資料來源:

服務網格(Service Mesh)

2017 年底,非侵入式的 Service Mesh 技術從萌芽到走向了成熟。

Service Mesh 又譯作“服務網格”,作為服務間通信的基礎設施層

如果用一句話來解釋什麼是 Service Mesh,可以將它比作是應用程式或者說微服務間的 TCP/IP,負責服務之間的網路調用、限流、熔斷和監控。對於編寫應用程式來說一般無須關心 TCP/IP 這一層(比如通過 HTTP 協議的 RESTful 應用),同樣使用 Service Mesh 也就無須關係服務之間的那些原來是通過應用程式或者其他框架實現的事情,比如 Spring Cloud、OSS,現在只要交給 Service Mesh 就可以了。

Service Mesh 的來龍去脈:

  1. 從最原始的主機之間直接使用網線相連
  2. 網路層的出現
  3. 集成到應用程式內部的控制流
  4. 分解到應用程式外部的控制流
  5. 應用程式的中集成服務發現和斷路器
  6. 出現了專門用於服務發現和斷路器的軟體包/庫,如 Twitter 的 Finagle 和 Facebook 的 Proxygen,這時候還是集成在應用程式內部
  7. 出現了專門用於服務發現和斷路器的開源軟體,如 Netflix OSS、Airbnb 的 synapse 和 nerve
  8. 最後作為微服務的中間層 Service Mesh 出現

Service Mesh 有如下幾個特點:

  • 應用程式間通訊的中間層
  • 輕量級網路代理
  • 應用程式無感知
  • 解耦應用程式的重試/超時、監控、追蹤和服務發現

Service Mesh 架構圖:

目前流行的 Service Mesh 開源軟體有 Linkerd、Envoy 和 Istio,而最近 Buoyant(開源 Linkerd 的公司)又發佈了基於 Kubernetes 的 Service Mesh 開源項目 Conduit。

Service Mesh 開源項目簡介:

  • Linkerdhttps://github.com/linkerd/linkerd):第一代 Service Mesh,2016 年 1 月 15 日首發佈,業界第一個 Service Mesh 項目,由 Buoyant 創業小公司開發(前 Twitter 工程師),2017 年 7 月 11 日,宣佈和 Istio 集成,成為 Istio 的數據面板。
  • Envoyhttps://github.com/envoyproxy/envoy):第一代 Service Mesh,2016 年 9 月 13 日首發佈,由 Matt Klein 個人開發(Lyft 工程師),之後默默發展,版本較穩定。
  • Istiohttps://github.com/istio/istio):第二代 Service Mesh,2017 年 5 月 24 日首發佈,由 Google、IBM 和 Lyft 聯合開發,只支持 Kubernetes 平臺,2017 年 11 月 30 日發佈 0.3 版本,開始支持非 Kubernetes 平臺,之後穩定的開發和發佈。
  • Conduithttps://github.com/runconduit/conduit):第二代 Service Mesh,2017 年 12 月 5 日首發佈,由 Buoyant 公司開發(借鑒 Istio 整體架構,部分進行了優化),對抗 Istio 壓力山大,也期待 Buoyant 公司的毅力。
  • nginMeshhttps://github.com/nginmesh/nginmesh):2017 年 9 月首發佈,由 Nginx 開發,定位是作為 Istio 的服務代理,也就是替代 Envoy,思路跟 Linkerd 之前和 Istio 集成很相似,極度低調,GitHub 上的 star 也只有不到 100。
  • Konghttps://github.com/Kong/kong):比 nginMesh 更加低調,默默發展中。

關於微服務和服務網格的區別,我的一些理解:微服務更像是一個服務之間的生態,專註於服務治理等方面,而服務網格更專註於服務之間的通信,以及和 DevOps 更好的結合

資料來源:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scal ...
  • 一、script引入(聯繫使用,小型項目) 直接下載並用 <script> 標簽引入,Vue 會被註冊為一個全局變數。 <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script> 二、Vue 提供一個官方命令 ...
  • $("body").on("click", ".submit_btn", function() { if (!$("#tel").val()) { alert("手機號不能為空"); $(this).attr("disabled", true); $(this).css({ background: ...
  • 最近閱讀《高性能JavaScript》時,在書中的“達夫設備“ 。 對此,有些感悟,同時有些疑問,希望看到的朋友,能幫忙解釋下,在此先提前感謝了。 1. 先說自己的理解吧: ”達夫設備“的目的是減少迭代次數,提高迴圈的效率,減少時間,提升性能。 感受:感覺代碼的優化,真的需要用工匠精神來雕琢,代碼的 ...
  • 本文原創 如轉載請註明出處!!! 本博客地址http://www.cnblogs.com/we-jack 本文原創,如果有同樣需求的小伙伴請第一時間聯繫我 或者在留言區留言 上次為大家提供了3D模型的展示之後 發現網上有很多想要計算3D模型錶面積和體積的需求 那麼經過掉了幾百根頭髮的艱辛歷程之後 終 ...
  • 最近使用websocket加ECharts做了一個實時監控的功能,發現了一個比較嚴重的問題,就是瀏覽器運行一段時間就會非常卡,之前在ECharts官網運行官方實例“動態數據 + 時間坐標軸”時,也遇到了同樣的情況,只是當時沒有當回事,現在來看原來是記憶體泄漏的問題。那麼是什麼原因導致的記憶體泄漏呢? 通 ...
  • 前端測試存在的問題 在講Sinon之前,我們得先講一下在學習了Mocha、chai以及enzyme之後,我們的前端測試還存在的一些問題。 比如前臺測試需要與後臺交互,獲取後臺數據後再根據相應數據進行測試。 又比如一個函數測試依賴另一個函數,我們可以根據測試的目的去模擬另一個函數,講兩者的測試分開,從 ...
  • 昨天發了一個面試題: "關於一道面試題【字元串 '1 + (5 2) 3',怎麼算出結果為10,'eval'除外】" ,受到了各位大大的指點,用一個比較簡單的解法就能夠計算出來,因此自己在下班後按照各位的指點又實現了一遍,這裡貼出來供大家參考。 瞭解首碼、中綴、尾碼表達式 關於概念這裡簡單貼一下,想 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...