1. 程式人生 > >微服務(Microservices)和服務網格(Service Mesh)架構概念整理

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

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

微服務(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。

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

資料來源:

相關推薦

服務Microservices服務網格Service Mesh架構概念整理

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

淺談服務治理、服務服務網格Service Mesh

淺談服務治理、微服務與Service Mesh Spring Cloud 之“出身名門望族” 作為當下最火熱的微服務框架,Spring Cloud的名字可以說是無人不知、無人不曉,憑藉之前Spring Framework的良好群眾基礎和Cloud這個具有

SpringMVC中文件的上傳上傳到服務下載問題--------下載

cat exc stream log trac close pri page fin 一、建立一個簡單的jsp頁面。 我們在建好的jsp的頁面中加入一個超鏈接:<a href="${pageContext.request.contextPath}/down

ant design pro 服務端進行互動

一、概述   原文地址:https://pro.ant.design/docs/server-cn   Ant Design Pro 是一套基於 React 技術棧的單頁面應用,我們提供的是前端程式碼和本地模擬資料的開發模式, 通過 Restful API 的形式和任何技術棧的服務端應用一起工作。下面將簡

面向服務的體系架構SOA業務元件BC的思考

1. 什麼是業務元件(BC) 元件化、模組化是軟體開發中一個很重要的概念,基於面向服務體系架構(Service Oriented Architecture,SOA)下,如何實現元件化,有各種實現方式,下面通過對各種元件概念的對比,從技術角度提出業務元件(Bus

laravel服務容器-----深入理解控制反轉IoC依賴注入DI

首先大家想一想什麼是容器,字面意思就是盛放東西的東西,常見的變數,物件屬性都是容器,一個容器能夠裝什麼東西,完全在於你對這個容器的定義。有的容器不僅僅只是存文字,變數,而是物件,屬性,那麼我們通過這種容器就可以進行很多高階的功能。 IoC容器 IoC容器是larave

信小程式,全域性樣式總的樣式區域性樣式頁面樣式的用法區別。

首先,全域性樣式寫在app.wxss裡面, 當然,頁面樣式當然寫在各個頁面的樣式裡, 第二 ,呼叫全域性樣式需要在你寫的類後面或前面加上你全域性樣式定義的類,(樣式的類越排後面,優先順序越高!) 比如: 這是我定義的全域性樣式 然後我要在區域性樣式裡呼叫

抽象類abstract class接口interface有什麽異同?

否則 繼承 默認 strong 什麽 成員 -s 實例 abstract 相同點: 1.抽象類和接口都不能被實例化,但可以定義抽象類和接口類型的引用。 2.一個類如果繼承了抽象類和接口,必須要對其中的抽象方法全部實現。(接口中方法默認的是public abstract修飾的

同步Synchronous異步Asynchronous

就會 一個 方法調用 這一 開始 訂單 必須 通知 下單 同步和異步通常用來形容一次方法調用。同步方法調用一旦開始,調用者必須等到方法調用返回後,才能繼續後續的行為。異步方法調用更像一個消息的傳遞,一旦開始,方法調用就會立即返回,調用者就可以繼續後續的操作。而異步方法通常會

走入計算機的第三十四天基於tcpudp的套接字

recv 設置 內存 tcp list dup lis 不知道 狀態 一 TCP套接字 1 low版TCP套接字 服務器端                              客戶端        2、改進版tcp套接字           服務端   

C語言中存儲類別又分為四類:自動auto、靜態static、寄存器的register外部的extern

字符變量 修飾 例如 register ext 進行 適合 sta -- 除法運算中註意: 如果相除的兩個數都是整數的話,則結果也為整數,小數部分省略,如8/3 = 2;而兩數中有一個為小數,結果則為小數,如:9.0/2 = 4.500000。 取余運算中註意: 該運算只適

maven可選依賴Optional Dependencies依賴排除Dependency Exclusions

許可 mave manage spa 兩個 傳遞 方式 mis ont 我們知道,maven的依賴關系是有傳遞性的。如:A-->B,B-->C。但有時候,項目A可能不是必需依賴C,因此需要在項目A中排除對A的依賴。在maven的依賴管理中,有兩種方式可以對依賴關

jqPaginator分頁ajax用法form表單提交用法

用法 () var meta lang 點擊 parse name back 一般使用方法 <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8">

轉發forward重定向redirect的區別

border 新的 狀態 rec nbsp url req red 完成 轉發與重定向的主要區別 轉發 重定向 轉發是服務器行為 重定向是客戶端行為 轉發瀏覽器url不改變 重定向瀏覽器url改變 轉發request請求數據不丟失 重定向request請

淺談淺克隆shallow clone 深克隆deep clone

turn ont row 控制臺 cep test 寫入 main supported 區別就在於是否對對象中的引用變量所指向的對象進行拷貝。 1.淺克隆/淺復制/淺拷貝   淺拷貝是指在拷貝對象時,對於基本數據類型的變量會重新復制一份,而對於引用類型的變量只是對引用進行拷

表單提交同步提交AJAX提交異步提交

接收 為我 spa 提交 method 提交按鈕 技術 分享 可能 表單提交(同步提交) HTML文件: PHP文件: 這樣就能接收到HTML裏輸入的內容,註意: FORM表頭method為POST,PHP文件獲取的方法就是$_POST,method為GET,PH

Linux(Centos)下調整分區大小以home根分區為例

vertical speech col 信息 卸載 記錄 jsb 大小 control 在安裝新系統的時候,有時候沒法預估或者說錯誤的劃分了分區大小,常常會導致我們後面的操作出現極大地不方便,比如某個分區分的太小了,導致 軟件安裝的時候會報安裝空間不夠,這就很麻煩。在

Linux後臺進程管理以及ctrl+z掛起、ctrl+c中斷、ctrl+退出ctrl+dEOF的區別(轉)

列表 art 信息 csdn 而是 png detail tps 後臺 一、後臺進程管理命令 fg、bg、jobs、&、ctrl + z、ctrl + c、ctrl + \、ctrl + d1、 &加在一個命令的最後,可以把這個命令放到後臺執行 ,如fire

C# 編程中的堆棧Stack隊列Queue

的區別 bottom seq 序表 gin 數組 src 優秀 順序隊列 一、什麽是堆?(Heap) 堆是無序的,是一片不連續的內存域,由用戶自己來控制和釋放,如果用戶自己不釋放的話,當內存達到一定的特定值時,通過垃圾回收器(GC)來回收。 是程序運行期

evalJSON.parse解析數據

bsp string 函數 作用 報錯 parse sta 強制 數據 JSON.parse()的用法比較單一,只能常規的將字符串JSON化,而eval()的用法很強大,除了常規的將字符串JSON化,還可以進行運算,拼接,處理表達式等 1.如果data是字符串,使用eval