天天看點

一文讀懂Service Mesh:邊車模式簡介

自從2016年Service Mesh(服務網格)的概念被提出以來,短短幾年時間就受到了廣大程式員們的熱烈歡迎?為什麼Service Mesh這麼容易被接受呢?原因很簡單,那就是它切中了早期微服務架構的痛點。進而極大地解放了生産力。要了解它是如何解決了程式員們的生産力的,我們先從早期微服務架構的痛點開始說起。

一、微服務架構的産生與問題

早期的很多系統都是單體服務的,就是把所有元件都塞在一個應用内,但是随着軟體複雜性和并發使用者數的急劇增加,單體應用無論是從開發效率和運維管理方面都已經不能适應時代的發展了。于是把各種服務獨立出來,每個服務隻關注自己的業務領域,與其它服務松耦合的微服務就應運而生了。

一文讀懂Service Mesh:邊車模式簡介

微服務架構具有以下幾個優點:

1、單⼀職責:拆分後的單個微服務,通常隻負責單個高内聚自閉環功能,是以很易于開發、了解和維護。

2、架構靈活:不同微服務應用之間在技術選型層面幾乎是獨立的,可以⾃由選擇最适合的技術棧。

3、部署隔離:相比巨無霸單體應用,單個微服務應用的代碼和産物體積大大減少,更容易持續內建和快速部署;同時,通過程序級别的隔離,也不再像單體應用一樣隻能同生共死,故障隔離效果顯著提升。

4、獨⽴擴充:單體應用時代,某個子產品如果存在資源瓶頸(e.g. CPU/記憶體),隻能跟随整個應用一起擴容,白白浪費很多資源。微服務化後,擴充的粒度細化到了微服務級别,可以更精确地按需獨立擴充。

但是,微服務帶來很多優點的時候,也出現了很多新的問題,最大的問題,就在于服務間通信的問題,具體來講,就是如下幾個問題:

  1. 如何找到服務的提供⽅?
  2. 如何保證遠端調⽤的可靠性?
  3. 如何降低服務調⽤的延遲?
  4. 如何保證服務調⽤的安全性?

于是,為了解決這些問題,微服務技術特有的通信語義就出現了,如熔斷政策、負載均衡、服務發現、認證和授權、quota限制、trace和監控等等,服務根據業務需求來實作一部分所需的通信語義。

但是,這樣做的問題也非常明顯,那就是,在這個過程中,開發人員需要花費大量的時間去編寫與業務功能無關的代碼。雖然架構本身屏蔽了分布式系統通信的一些通用功能實作細節,但開發者卻要花更多精力去掌握和管理複雜的架構本身,在實際應用中,去追蹤和解決架構出現的問題也絕非易事。

另外,開發架構通常隻支援一種或幾種特定的語言,沒有架構支援的語言編寫的服務,很難融入面向微服務的架構體系,想因地制宜地用多種語言實作架構體系中的不同子產品也很難做到。同時架構以lib庫的形式和服務聯編,複雜項目依賴時的庫版本相容問題非常棘手架構庫的更新也無法對服務透明,服務會因為和業務無關的lib庫更新而被迫更新。

于是,為了解決這些問題,Service Mesh誕生了。

一文讀懂Service Mesh:邊車模式簡介

二、Service Mesh:微服務時代的TCP/IP協定

Serice Mesh的誕生,就是為了将微服務時代的通信語義剝離出來,進而使得微服務本身更加關注業務邏輯,它為每個微服務提供了一個代理,而這個代理如同TCP/IP協定一樣,把微服務時代所需要的通信語義放在一個層面完成,進而使得業務開發者們從繁重的工作中解放出來。而這個代理,就是大名鼎鼎的Sidecar(邊車)模式了。

Sidecar原意是指從二戰時開始被廣泛使用起來的挎鬥機車。這個名字也是一種著名的飾以紅櫻桃的混合雞尾酒,同時也指在三人以上多人運動中,在旁邊處于輔助地位或者拍攝的人。

一文讀懂Service Mesh:邊車模式簡介

在Service Mesh中,監視、日志、限流、熔斷、服務注冊、協定轉換、冪等……" 這些功能,其實都是大同小異,是完全可以做成标準化的元件和子產品的。在這種情況下,邊車就像一個微服務的 Agent,這個服務所有對外的進出通訊都通過這個 Agent 來完成。這樣,我們就可以在這個 Agent 上做很多文章了。

這樣,所有的微服務通過Sidecar連接配接起來之後,就像一個網格一樣,這也是Service Mesh名稱的由來。

一文讀懂Service Mesh:邊車模式簡介

那麼,Sidecar具體的作用是什麼呢?我們以Service Mesh概念的提出者Buoyant出品的Linkerd為例,來解析一下邊車模式的服務流程。在Linkerd裡面,一個服務請求的處理流程包括以下幾個部分:

一文讀懂Service Mesh:邊車模式簡介

1、動态路由:根據上遊服務請求參數,确定下遊目标服務;除了正常的服務路由政策,Linkerd還可以通過這一層動态路由能力,支援灰階釋出、A/B測試、環境隔離等非常有價值的場景。

2、服務發現:确定目标服務後,下一步就是擷取對應的執行個體的位址列表(e.g. 查詢service registry)。

3、負載均衡:如果清單中有多個位址,Linkerd會通過負載均衡算法(e.g. Least Loaded、Peak EWMA)選擇其中⼀個合适的低延遲執行個體。

4、執行請求:發送請求到上一步所選擇的執行個體,并記錄延遲和響應結果。

5、重試處理:如果請求未響應,則選擇另⼀個執行個體重試(前提:Linkerd知道該請求是幂等的)。

6、熔斷處理:如果發往某個執行個體的請求經常失敗,則主動從位址清單中剔除該執行個體。

7、逾時處理:如果請求超期(在給定的deadline時間點之前仍未傳回),則主動傳回失敗響應。

8、可觀測性:Linkerd會持續收集和上報上述各種行為資料,包括Metrics和Tracing。

而這些服務,就類似于TCP服務提供的網絡傳輸處理邏輯了,類似于TCP服務解決了網絡傳輸中通用的流量控制問題,将技術棧下移,從服務的實作中抽離出來,成為作業系統網絡層的一部分一樣,Service Mesh也将微服務間通信所需要的通用功能剝離出來,将技術棧單獨抽出一層,進而成為分布式系統的一部分。

三、主流Service Mesh實作

目前主流的Service Mesh實作包括Linkerd、Envoy、Istio、Conduit等。

喜歡本文的話,歡迎關注活在資訊時代哦:)

繼續閱讀