1 什么是服務網格?
服務網格是分布式軟件系統內部用於管理所有“服務到服務”通信的一個系統。
聊服務網格為什么會出現之前,可以聊聊服務架構的演進過程。起初,我們使用一個單體應用來提供服務。 比如我們在做一個電商系統,采用典型的MVC三層架構,在單體架構中,組成這個系統的購物車功能,庫存查詢功能,訂單功能等都是這個服務內部的一個函數或接口。所以這些操作都是進程內的函數調用,不涉及諸如RPC等服務與服務的跨進程通信。但隨着時間的增加,我們發現單體架構越來越不能滿足我們的需求,比如用戶訪問暴增,業務邏輯愈加復雜,一個單體的服務已不能滿足功能及性能的要求。我們需要將其按業務領域拆分為幾個獨立的服務來對外提供服務,這就是微服務架構。比如原來的購物車功能,庫存查詢功能,訂單功能被拆分為獨立的服務。這時接收到一個購物請求,我們需要分別查詢不同的微服務來進行業務處理,這就涉及跨進程通信。
而由於服務到服務通信的網絡不穩定性,所以如下問題隨即出現了:請求失敗時如何進行重試?請求超時如何處理?請求太頻繁如何限速?服務熔斷怎么做?… 而基於語言或框架的輔助庫即是一種解決方案,如Netflix的Eureka,Hystrix等。而在服務里邊解決服務與服務通信問題存在多個弊端,如:需要侵入業務代碼,受語言或框架限制等。所以,完全解耦的,基於代理模式的服務網格設計理念更符合業界的青睞。
下圖即是一個服務網格部署圖,即每個服務的實例旁邊都有一個代理,這些代理被形象的稱為Sidecar,其來負責對被代理服務的進出流量進行管理。整個系統的所有這些負責服務與服務通信的Sidecar即組成一個服務網格。所以服務只要關注業務邏輯即可,服務與服務通信的邏輯被抽到了服務網格里邊,實現了解耦。
因服務網格代理了分布式系統內所有服務與服務通信的進出流量,相當於將分布式系統中最關鍵的一些跨進程連接點串聯起來,並將其管理,觀察。所以其就像系統的眼睛一樣,讓開發者不再對龐大的調用網絡望而生畏,讓分布式系統像單體架構一樣可以做到可觀察。
2 服務網格發展歷史
2010年初,Twitter開始開發基於Scala的Finagle,自此Linkerd服務網格誕生。
2013年末,SmartStack提供一種基於HAProxy的進程外的服務發現機制以滿足逐漸興起的微服務架構。
2014,Netflix發布包括Prana的一組JVM工具包,允許不同語言開發的服務通過HTTP進行調用。
2016,NGINX開發Fabric Model,一個基於NGINX Plus的類服務網格產品。
2017以后,Linkerd,Istio,Maesh,Kuma逐步興起。
3 服務網格架構
經過上面的介紹,我們對服務網格的衍生及其解決的問題有了一定的了解。本節粗略看一下業內服務網格的通用設計及系統架構,以期對其有一個更好的認識。
服務網格主要由兩部分組成:負責管理服務與服務通信的Sidecar Proxy被稱為數據面;以UI,配置及命令等控制數據面行為的被稱為控制面。
4 使用服務網格可以做什么?
-
流量管理
提供灰度發布,按規則流量分發等功能。
-
熔斷重試
提供超時處理,熔斷,重試等功能。
-
鑒權授權
提供mTLS安全通信,服務與服務的鑒權授權等功能。
-
觀察及監控
提供請求量統計,請求延時統計,請求成功率統計,分布式鏈路追蹤等功能。
5 服務網格的實現
CNCF孵化項目,100%開源,Rust實現,目標是極簡,能用,數據面代理極小(<10mb),速度極快(<1ms)。
最流行的服務網格實現,基於Envoy數據面,背靠谷歌及IBM,功能豐富
HashiCorp出品,基於Envoy數據面,支持的平台多。
基於API Gateway Kong的服務網格。
基於雲原生API Gateway Traefik的服務網格。
更詳細對比,請參考 servicemesh.es。
6 服務網格的未來
Mecha - 多運行時微服務架構。未來架構的趨勢可能是將所有傳統的中間件遷移至其它運行時,只在服務中編寫業務邏輯。微軟Dapr是業界第一個多運行時實踐項目。
參考資料
[1] What is a service mesh? - RedHat