雲原生時代,你應該瞭解的Service Mesh

導讀:本文系 Service Mesh 系列文章的第一篇,一步步帶讀者瞭解 Service Mesh 的基礎概念和前世此生。安全

後續還將會爲讀者帶來系列 Service Mesh 文章,內容涵蓋 Istio 入門體驗、Istio 和 Envoy 源碼深度解析、服務網格大規模落地經驗、服務網格性能優化等,敬請持續關注。性能優化

Service Mesh 做爲下一代微服務技術的代名詞,初出茅廬卻深得人心一舉成名,大有一統微服務時代的趨勢。網絡

那麼到底什麼是 Service Mesh ?架構

一言以蔽之:Service Mesh是微服務時代的TCP協議。

有了這樣一個感性的初步認知,咱們再來看到底什麼是 Service Mesh 。負載均衡

提到 Service Mesh ,就不得不提微服務。根據維基百科的定義:框架

微服務 ( Microservices ) 是一種軟件架構風格,它是以專一於單一責任與功能的小型功能區塊 ( Small Building Blocks ) 爲基礎,利用模塊化的方式組合出複雜的大型應用程序,各功能區塊使用與語言無關( Language-Independent/Language agnostic ) 的 API 集相互通訊。運維

目前業界跟微服務相關的開發平臺、框架、概念更是不勝枚舉:Spring Cloud,Service Fabric ,Linkerd ,Istio ,Envoy ,Consul ,NginMesh ,OSM ...
這些紛繁的產品和 Sevice Mesh 有什麼樣的關聯?哪些屬於 Service Mesh 的範疇?分佈式

爲了理清這些繁複的產品和概念,咱們先來了解下微服務和 Service Mesh 技術的歷史發展脈絡。
瞭解清楚了技術的主要脈絡,就能清晰的知道上述的各個平臺、框架屬於技術脈絡中的哪一個結點,其間的關係也就一目瞭然。
Phil Calçado 的文章《 Pattern: Service Mesh 》,詳細的介紹了從開發者視角來看,服務開發模式和 Service Mesh 技術的演化過程,我的認爲是很是經典的學習 Service Mesh 的資料,感興趣的讀者也能夠閱讀英文原文。這裏借用文章繪圖和脈絡,結合本身的理解並予以簡化,試圖說清楚 ServiceMesh 的概念和這項技術誕生的歷史必然性,讀者也能夠將本文做爲原文的一個簡化中文版原本閱讀。模塊化

時代0抽象時代

開發人員想象中,不一樣服務間通訊的方式,抽象表示以下:微服務

時代1:原始通訊時代 

然而現實遠比想象的複雜,在實際狀況中,通訊須要底層可以傳輸字節碼和電子信號的物理層來完成,在TCP協議出現以前,服務須要本身處理網絡通訊所面臨的丟包、亂序、重試等一系列流控問題,所以服務實現中,除了業務邏輯外,還夾雜着對網絡傳輸問題的處理邏輯。

時代2:TCP時代

爲了不每一個服務都須要本身實現一套類似的網絡傳輸處理邏輯,TCP協議出現了,它解決了網絡傳輸中通用的流量控制問題,將技術棧下移,從服務的實現中抽離出來,成爲操做系統網絡層的一部分。

時代3:第一代微服務

在TCP出現以後,機器之間的網絡通訊再也不是一個難題,以 GFS / BigTable / MapReduce 爲表明的分佈式系統得以蓬勃發展。這時,分佈式系統特有的通訊語義又出現了,如熔斷限流、負載均衡、服務發現、認證受權、安全加密、trace和監控等等,因而服務根據業務需求來實現一部分所需的通訊語義。

時代4:第二代微服務

爲了不每一個服務都須要本身實現一套分佈式系統通訊的語義功能,隨着技術的發展,一些面向微服務架構的開發框架出現了,如 Twitter 的 Finagle 、 Facebook 的 Proxygen 以及 Spring Cloud 等等,這些框架實現了分佈式系統通訊須要的各類通用語義功能:如負載均衡和服務發現等,所以必定程度上屏蔽了這些通訊細節,使得開發人員使用較少的框架代碼就能開發出健壯的分佈式系統。

時代5:第一代Service Mesh

第二代微服務模式看似完美,但開發人員很快又發現,它也存在一些本質問題:

  • 其一,雖然框架自己屏蔽了分佈式系統通訊的一些通用功能實現細節,但開發者卻要花更多精力去掌握和管理複雜的框架自己,在實際應用中,去追蹤和解決框架出現的問題也絕非易事;

  • 其二,開發框架一般只支持一種或幾種特定的語言,回過頭來看文章最開始對微服務的定義,一個重要的特性就是語言無關,但那些沒有框架支持的語言編寫的服務,很難融入面向微服務的架構體系,想因地制宜的用多種語言實現架構體系中的不一樣模塊也很難作到;

  • 其三,框架以 lib 庫的形式和服務聯編,複雜項目依賴時的庫版本兼容問題很是棘手,同時,框架庫的升級也沒法對服務透明,服務會由於和業務無關的 lib 庫升級而被迫升級。

所以以 Linkerd ,Envoy ,Ngixmesh 爲表明的代理模式(邊車模式)應運而生,這就是第一代 Service Mesh ,它將分佈式服務的通訊抽象爲單獨一層,在這一層中實現負載均衡、服務發現、認證受權、監控追蹤、流量控制等等分佈式系統所須要的功能,做爲一個和服務對等的代理服務,和服務部署在一塊兒,接管服務的流量,經過代理之間的通訊間接完成服務之間的通訊請求,這樣上邊所說的三個問題也迎刃而解。

若是咱們從一個全局視角來看,就會獲得以下部署圖:

     

若是咱們暫時略去服務,只看Service Mesh的單機組件組成的網絡:

相信如今,你們已經理解何所謂Service Mesh,也就是服務網格了。它看起來確實就像是一個由若干服務代理所組成的錯綜複雜的網格。

時代6:第二代Service Mesh

第一代 Service Mesh 由一系列獨立運行的單機代理服務構成,爲了提供統一的上層運維入口,演化出了集中式的控制面板,全部的單機代理組件經過和控制面板交互進行網絡拓撲策略的更新和單機數據的彙報。
這就是以 Istio 爲表明的第二代 Service Mesh 。

只看單機代理組件(數據面板)和控制面板的Service Mesh全局部署視圖:

至此,見證了6個時代的變遷,你們必定清楚了Service Mesh技術究竟是什麼,以及是如何一步步演化到今天這樣一個形態。

如今,咱們再回過頭來看 Buoyant 的 CEO William Morgan ,也就是 Service Mesh 這個詞的發明人,對 Service Mesh 的定義:

服務網格是一個基礎設施層,用於處理服務間通訊。雲原生應用有着複雜的服務拓撲,服務網格保證請求在這些拓撲中可靠地穿梭。在實際應用當中,服務網格一般是由一系列輕量級的網絡代理組成的,它們與應用程序部署在一塊兒,但對應用程序透明

這個定義中,有四個關鍵詞:

  • 基礎設施層+請求在這些拓撲中可靠穿梭這兩個詞加起來描述了 Service Mesh 的定位和功能,是否是似曾相識?沒錯,你必定想到了 TCP ;

  • 網絡代這描述了 Service Mesh 的實現形態;

  • 對應用透明這描述了 Service Mesh 的關鍵特色,正是因爲這個特色, Service Mesh 可以解決以 Spring Cloud 爲表明的第二代微服務框架所面臨的三個本質問題。

總結一下,Service Mesh 具備以下優勢:

  • 屏蔽分佈式系統通訊的複雜性(負載均衡、服務發現、認證受權、監控追蹤、流量控制等等),服務只用關注業務邏輯;

  • 真正的語言無關,服務能夠用任何語言編寫,只需和Service Mesh 通訊便可;

  • 對應用透明,Service Mesh 組件能夠單獨升級,解耦架構和業務團隊。

固然,Service Mesh 目前也面臨一些挑戰:

  • Service Mesh 組件以代理模式計算並轉發請求,必定程度上會下降通訊系統性能,並增長系統資源開銷;

  • Service Mesh 組件接管了網絡流量,所以服務的總體穩定性依賴於 Service Mesh ,同時額外引入的大量 Service Mesh 服務實例的運維和管理也是一個挑戰。

歷史老是驚人的類似。爲了解決端到端的字節碼通訊問題,TCP 協議誕生,讓多機通訊變得簡單可靠;微服務時代,Service Mesh 應運而生,屏蔽了分佈式系統的諸多複雜性,讓開發者能夠迴歸業務,聚焦真正的價值。

 


做者簡介:陳鵬,百度研發工程師,現就任於百度基礎架構部雲原生團隊,主導和參與了服務網格在百度內部多個核心業務的大規模落地,對雲原生、Service Mesh、Isito等方向有深刻的研究和實踐經驗。

瞭解更多微服務、雲原生技術的相關信息

相關文章
相關標籤/搜索