本文是Service Mesh系列第1篇
隨著雲原生時代的來臨,使用微服務架構的朋友們開始聽到一個新的技術名詞——Service Mesh(現在來說已經不算新了)。
對於一項新技術的學習,總歸繞不過兩個問題:
- 它是什麼?
- 為什麼需要它?
本文將圍繞這兩個問題進行展開,期望對Service Mesh有一個綜述性的瞭解。
最後,引發一個核心的思考:
- 到底誰才需要Service Mesh?
1. 什麼是Service Mesh
Service Mesh 在國內被翻譯「服務網格」。
目前比較公認的是Buoyant公司的CEO William Morgan給出的定義:
Service Mesh是用於處理服務到服務通訊的專用基礎架構層。Cloud Native有著複雜的服務拓撲,它負責可靠地傳遞請求。實際上,Service Mesh通常作為一組輕量級網路代理實現,這些代理與應用程式程式碼部署在一起,應用程式無感知。
這個定義看起來有些複雜,我們抽取其中的關鍵詞,可能會更加清晰一些:
- 服務到服務通訊的基礎架構層(定位)
- 在複雜的服務拓撲中,可靠地傳遞請求(目標)
- 輕量級網路代理實現(實現)
- 應用程式無感知(特點)
從定位、目標、特點來看,我們聯想到了什麼呢?
沒錯,就是 TCP/IP協議!
對於雲原生下的微服務,Service Mesh就是等同於 TCP/IP協議 一樣的 基礎設施,負責服務之間的網路呼叫、路由管理、限流和監控等。
使用了Service Mesh,我們就不需要在應用程式編寫時,去關注服務間呼叫的框架適配、升級等問題,比如Spring Cloud、Dubbo等。就像我們過去編寫應用程式時一樣,基本不會再關注TCP/IP這一層的問題。
另外,從實現角度來看,這個輕量級的網路代理實現,往往以Sidecar(邊車)來稱呼(其實就是Proxy)。
我們看下Service Mesh的架構。
(圖片來自
https://philcalcado.com/2017/08/03/pattern_service_mesh.html)
「服務網格」分為兩個核心部分:
- 資料平面。以Sidecar作為資料平面節點,對應用來說完全透明,所有流量進出都會經過Sidecar。
- 控制平面。集中式的控制平面,提供統一的上層運維入口,所有的Sidecar代理元件通過和控制平面互動進行網路拓撲策略的更新和單機資料的彙報。
2.為什麼需要Service Mesh
一項新技術的產生與引入,必然是為了解決已有的問題。引入Service Mesh的原因,也是為了解決已有微服務框架存在的問題。
為了更深刻地理解Service Mesh解決的問題,我們結合Phil Calçado的文章《Pattern: Service Mesh》,梳理下服務開發模式和Service Mesh技術的演化過程。
1)原始通訊時代 1.0
在原始通訊時代(TCP協議出現前),服務需要自己處理網路通訊所面臨的丟包、亂序、重試等一系列Flow Control問題。所以在業務邏輯程式碼之外,還需要考慮對網路傳輸問題進行處理。
2)原始通訊時代 2.0
為了解決這種業務無關的通過網路傳輸問題,TCP/IP協議出現,並將這部分Flow Control問題“下沉”到作業系統層面。業務開發不再需要關注網路傳輸問題,可以專注於業務邏輯開發。
3)微服務的服務治理1.0
隨著微服務架構的推廣,單體服務逐漸向分散式系統發展,服務間呼叫變得越來越複雜。
這時候,微服務架構下的 “Flow Control”問題不斷出現,包括 服務註冊與發現、限流、熔斷等等。所以,在業務邏輯程式碼中,我們又需要開發一些模組解決這類業務無關的問題。
4)微服務的服務治理2.0 —— 微服務框架
為了解決微服務架構下的通用通訊問題,各種微服務框架開始出現,Spring cloud、Dubbo等框架都是為了解決這類通用問題而產生。
這些框架通過客戶端依賴包的形式,向業務開發遮蔽了包括 服務註冊與發現、限流、熔斷等等處理邏輯,只需要簡單的配置,就能完成比較健壯的微服務架構。
5)微服務的服務治理3.0 —— Service Mesh
微服務框架雖然能解決通用化的服務治理問題,但是在實踐中也存在一定的弊端:
- 客戶端依賴包的形式,註定了與開發語言強繫結。比較主流的微服務框架基本是Java實現的,如果業務架構中存在其他語言的服務,就比較難享受同樣的便利。而針對不同語言都開發一套微服務框架,又是比較高成本且難以維護的事情。被微服務框架限定了開發語言,那顯然不是一個好的事情。
- 客戶端依賴包的形式,註定了業務需要關注依賴包的升級與適配。一些複雜專案依賴包眾多,經常需要處理包衝突的問題,令人頭大。同時,框架庫的升級也無法對服務透明,必須推進業務去完成,業務開發同學和框架維護同學都很疲憊,sigh~~
如果能像TCP/IP一樣,將服務治理“下沉”,徹底與應用服務解耦,那就能解決上述問題了。
所以,以Linkerd,Envoy,NginxMesh為代表的Sidecar模式的Service Mesh產品應運而生。它們將微服務通訊的通用問題,服務註冊發現、限流、熔斷、監控等功能,單獨抽出了Sidecar服務,完全接管了服務間的網路通訊,並且獨立執行,與業務應用徹底解耦。這樣就解決了傳統客戶端模式微服務框架的痛點。
而後,istiol為代表的Service Mesh產品,在Sidecar模式之基礎上(istio中的sidecar採用了Envoy),又引入了統一的控制平面,方便進行管理與維護更新。
至此,相信我們對“為什麼需要Service Mesh”有了深刻的認識,正是基於上述的演進歷史,才有了現在的微服務的服務治理方案Service Mesh.
3.誰需要Service Mesh
既然Service Mesh這麼好,是不是可以無腦上呢?就實際情況來看,不是的。
為什麼呢?
Service Mesh在服務治理上,其實並沒有更多的“功能性”新特性,比較吸引人的基礎特性包括:
- 天然的雲原生元件
- 能夠獨立升級與演進
- 語言無關性
但在一個相對成熟的生產環境中,就目前來看,無論是Dubbo、spring cloud 或者是 自研的微服務框架,都已經相對成熟了,治理能力都比較完善,很少需要去升級或者擴充套件。
尤其是在服務註冊與發現的核心功能不變情況下,一些擴充套件升級基本不需要所有後端服務都去升級適配。
那麼基於“能夠獨立升級與演進” 的特性就不是那麼有說服力了,至少是沒有那麼大的“業務價值”去驅動的。
那麼到底誰才適合引入Service Mesh?
1)雲原生基礎的新企業(新生產線)
一切從零開始,就基於雲原生技術棧的新企業,是非常適合直接引入Service Mesh的 。
雲原生天然的服務註冊發現、服務治理、雲原生可觀測,統統圍繞Service Mesh展開,業務開發將能更好地專注於業務迭代,而不再需要關注這些業務無關的基礎架構的迭代。
當然,一些深入瞭解雲原生技術棧的基礎架構維護者是必不可少的。
2)技術棧多樣化的成熟企業
那對於一個相對成熟的企業來說,微服務框架、配置中心、全鏈路追蹤系統等,都已經比較成熟,治理能力都比較完善,很少需要去升級或者擴充套件。
因此,要引入Service Mesh,大部分是基於「技術棧多樣化」的需求。
所謂「技術棧多樣化」,包括:
- 業務場景特性不同。比如web專案使用Java、後臺高效能運算服務使用go/c++、業務請求量波動劇烈的業務使用Faas、前端微服務使用nodejs等。
- 一些特殊的招聘需求。
「技術棧多樣化」帶來的複雜架構,給傳統微服務框架帶來了巨大挑戰,客戶端模式(語言強繫結)的微服務框架已經無法滿足這樣的複雜需求了。
因此,在雲原生架構下,Service Mesh的「語言無關性」的特點,給予了異構應用程式的更多可行性,讓使用者可以快速的編排出複雜環境、複雜依賴關係的應用程式。
4.小結
本文圍繞“什麼是Service Mesh”、“為什麼需要Service Mesh”兩個主題,對ServiceMesh進行了綜述性的分享。
最後,根據生產落地中的實際情況,思考了真正適合Service Mesh落地的場景。
期望能對大家有所啟發。
都看到最後了,原創不易,點個關注,點個贊吧~
文章持續更新,可以微信搜尋「阿丸筆記 」第一時間閱讀,回覆【筆記】獲取Canal、MySQL、HBase、JAVA實戰筆記,回覆【資料】獲取一線大廠面試資料。
知識碎片重新梳理,構建Java知識圖譜:github.com/saigu/JavaK…(歷史文章查閱非常方便)