隨著技術體系的不斷革新,基於原有的模式或思路使得軟體的架構越來越難以維護,無論是國外還是國內的軟體行業,都得到進一步的證實。依據各大主流技術論壇或者商業網站,目測,全球大約有85%以上的企業計劃使用或者正在使用微服務體系生態。畢竟,原有的單一架構體系難以繼續開發和持續維護,而基於微服務生態則允許使用較小的目標服務來實現更大的敏捷性收益。
然而,我們發現,在實際的業務場景中,隨著組織構建更多的微服務(通常基於不同的程式語言和部署模型),使得它們最終會面臨複雜的環境,這些環境可能會使得成本高昂且難以操作。這種複雜性在某種意義上扼殺了創新,公然違背了微服務的初衷。
那麼,企業如何能夠全面、大規模地維護和管理所有服務以及如何使得我們的微服務依據業務的複雜性能夠很好的落地呢? 這是一個值得深思的話題,同時也是一個必須面對、解決的問題。由此,Service Mesh 技術應運而生,解決了這一痛點。
首先,我們先了解下在實際的業務場景中,常用的微服務邏輯架構,具體如下圖所示:
什麼是 Service Mesh ?
Service Mesh 這個概念最早由開發Linkerd 的 Buoyant, Inc 公司 CEO William Morgan 提出:服務網格即通過將這些功能插入平臺層而非應用程式層來向應用程式添加可觀察性,安全性和可靠性功能的工具。具體什麼意思呢?首先,Service Mesh 是一個專門負責請求可靠傳輸的基礎架構層,也就是說它是一種底層框架,其次,Service Mesh 與應用部署在一起,通過網絡代理來實現,使得應用程式無感知。
服務網格是微服務部署的一種體系結構模式,通常被實現為與應用程式代碼一起部署的可伸縮網絡代理集(一種有時稱為Sidecar的模式)。這些代理處理微服務之間的通信,並充當可以引入服務網格功能的點。代理伺服器組成服務網格的數據平面,並由其控制平面進行整體控制。其主要目標是確保服務之間的通信安全,快速和可靠。
對於Service Mesh 的概念其所負有的職責邊界,William Morgan 對其進行明確的補充:服務網格的興起與「雲原生」應用程式的興起息息相關。在雲原生世界中,一個應用程式可能包含數百個服務。每個服務可能有數千個實例;而且這些實例中的每一個實例都可能處於不斷變化的狀態,因為它們是由像Kubernetes這樣的協調器動態調度的。在這個世界中,服務之間的通信不僅非常複雜,而且是應用程式運行時行為的基本組成部分。管理它對於確保端到端性能,可靠性和安全性至關重要。
基於上述所述,我們來看下Service Mesh 簡要架構圖,具體如下所示:
基於上述架構圖,我們可以得知:在服務網格體系結構中,給定部署或集群中的微服務通過 Sidecar 代理相互交互。這些交互背後的安全和通信規則是通過控制平面定向的。開發人員可以在控制平面級別配置和添加策略,並且可以抽象化微服務背後的治理注意事項,而與構建技術無關。流行的Service Mesh框架(例如Istio)應運而生,以幫助組織實施這些體系結構模式。下面我們對Service Mesh 架構中的核心組件進行簡要解析,具體如下:
SideCar 模式
SideCar 模式是 Service Mesh 的一個核心關鍵要素。首先來看熟悉下在傳統的微服務中體系中,服務與服務之間是怎樣進行交互,具體如下圖所示:
在上述的服務調用鏈路中,NetworkFunctions 組件即我們所說的業務場景中所具備的熔斷降級,負載均衡等一系列的相關功能。那麼,對於我們新一代微服務 Service Mesh 其服務之間的相互調用又是怎樣的呢?具體可參考如下圖示:
基於上述服務調用鏈-Service Mesh,我們可以看到,原本服務框架中需要在我們每個服務裡面實現的一些框架功能,諸如,服務發現、負載均衡、熔斷降級均已由 SideCar來 實現,而我們的服務代碼、業務代碼再也不用關心與業務本身無關的內容。
Control Plane
基於上述的解析,我們知道 Sidecar 實現了服務的攔截調用功能,所有的服務都通過 SideCar 來進行轉發和流量處理,這樣所有的 Sidecar 再通過一個Control Plane 作為中心點來管控全局,這就形成了一個服務網格。有了前面 SideCar 的作用,Control Plane 作為一個中心點的作用就很明顯了,具體如下:
1、服務發現,我們寫的服務通過Sidecar 註冊到 Control Plane 的註冊中心,這樣當,服務需要進行其他服務調用的時候,先經過 SideCar,然後 SideCar 去 Control Plane 註冊中心查詢相應的服務提供者的列表。
2、負載均衡,承接上一步,拿到了服務提供者的列表之後,SideCar 就根據一定的負載均衡算法選擇一個節點進行調用。同時通過 ControlPlane 也可以修改這些 SideCar 的負載均衡算法。
3、請求路由,SideCar 從Control Plane 拿到服務提供者列表之後,也可以通過 Control Plane 來進行控制,例如 A/B Test、流量切換等等。
4、故障處理,服務之間調用如果出現故障,就需要加以控制、超時重傳、熔斷等,這些都可以通過 SideCar 轉發時,通過 Control Plane 動態配置。
5、安全認證,通過 Control Plane 控制哪個服務可以被誰進行訪問,以及訪問哪些信息
監控上報,所有 SideCar 轉發的信息都會經過 Control Plane,再由 Control Plane 發送給監控系統,例如Prometheus。
6、日誌記錄,所有 SideCar 轉發的日誌信息也會經過 Control Plane,再由 ControlPlane 發送給日誌系統。
7、資源配額,例如可以在 Control Plane 裡面對每個服務配置最大調用次數,這樣 SideCar 轉發調用時就會進行次數的審計。
上述我們簡要解析了Service Mesh的基本架構、工作流,回到之前的問題,基於 Service Mesh 的應用,到底能夠幫我們解決哪些問題?基於作者的淺薄經驗,具體總結如下:
1、雲原生的需要,在越來越多的微服務進行了容器化,並且開始在如 Kubernetes 這樣的平臺上運行。傳統的服務治理,需要在業務代碼裡集成服務框架的SDK,這就比較麻煩,而Service Mesh 可以無侵入的進行服務治理,比較符合雲原生的理念。具體可參考如下拓撲所示:
2、基於不同程式語言調用的需要,目前為止,支持微服務體系的語言較多,現有的很多開源微服務框架要麼與特定的語言綁定如 Dubbo 和 Spring Cloud,僅支持 Java,要麼是與語言無關如 gRPC,需要定義IDL文件,然後根據這個文件生成不同語言的Client 和Server,並且很多功能例如超時重傳,負載均衡,服務發現等等。
那麼,最後,我們真的需要Service Mesh 嗎?
Service Mesh 已經被視為大部分基於微服務體系的公司的重要組成部分。根據Gartner和IDC的說法,將微服務部署到生產中的公司將需要某種形式的服務網格功能才能進行擴展。
但是,服務網格無法獨自解決微服務生命周期中的所有挑戰。組織仍然需要一種輕鬆地在團隊之間發布和重用服務的方法。此外,如上所述,服務網格旨在在特定群集內進行服務到服務的通信。在典型的企業中,幾種服務還將在任何一個特定域之外擁有消費者。
因此,企業需要一種方法來集中其服務的發現、管理和安全性,而與語言、域或部署模型無關。到此,關於Service Mesh (服務網格)相關內容解析為止,大家有什麼問題,歡迎隨時留言溝通。
- EOF -
點擊關注公眾號:"牧師架構之路"
如果您喜歡本文,歡迎點擊右上角,把文章分享到朋友圈~~~