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,Envoy,Istio ...分佈式
這些紛繁的產品和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爲表明的分佈式系統得以蓬勃發展。這時,分佈式系統特有的通訊語義又出現了,如熔斷策略、負載均衡、服務發現、認證和受權、quota限制、trace和監控等等,因而服務根據業務需求來實現一部分所需的通訊語義。
時代4:第二代微服務
爲了不每一個服務都須要本身實現一套分佈式系統通訊的語義功能,隨着技術的發展,一些面向微服務架構的開發框架出現了,如Twitter的Finagle、Facebook的Proxygen以及Spring Cloud等等,這些框架實現了分佈式系統通訊須要的各類通用語義功能:如負載均衡和服務發現等,所以必定程度上屏蔽了這些通訊細節,使得開發人員使用較少的框架代碼就能開發出健壯的分佈式系統。
時代5:第一代Service Mesh
第二代微服務模式看似完美,但開發人員很快又發現,它也存在一些本質問題:
所以以Linkerd,Envoy,NginxMesh爲表明的代理模式(邊車模式)應運而生,這就是第一代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目前也面臨一些挑戰:
歷史老是驚人的類似。爲了解決端到端的字節碼通訊問題,TCP協議誕生,讓多機通訊變得簡單可靠;微服務時代,Service Mesh應運而生,屏蔽了分佈式系統的諸多複雜性,讓開發者能夠迴歸業務,聚焦真正的價值。