解讀服務(wù)網(wǎng)格(Service Mesh)為開發(fā)人員提供的能力
最近,服務(wù)網(wǎng)格(Service Mesh)在開發(fā)人員中越來越受歡迎,特別是在希望解決橫切關(guān)注點(diǎn)的Spring和Java開發(fā)人員中。但是,您是否想知道什么是服務(wù)網(wǎng)格?有哪些流行的類型?最重要的是,它們到底解決了哪些問題?別擔(dān)心,本文將為您提供答案。
什么是服務(wù)網(wǎng)格?
服務(wù)網(wǎng)格是一個(gè)專用的基礎(chǔ)架構(gòu)層,用于管理分布式應(yīng)用程序中各個(gè)微服務(wù)之間的通信。它充當(dāng)透明且分散的代理網(wǎng)絡(luò),這些代理部署在應(yīng)用服務(wù)旁邊。這些代理通常被稱為sidecar,它們處理服務(wù)之間的通信,提供諸如服務(wù)發(fā)現(xiàn)、負(fù)載均衡、流量路由、身份驗(yàn)證和可觀測(cè)性等關(guān)鍵功能。
通過將網(wǎng)絡(luò)通信的復(fù)雜性抽象化,服務(wù)網(wǎng)格使開發(fā)人員能夠?qū)W⒂趹?yīng)用程序邏輯,而不必處理網(wǎng)絡(luò)代碼的復(fù)雜性。它提供了一種一致且靈活的處理跨服務(wù)通信的方式,并允許實(shí)現(xiàn)高級(jí)的流量管理策略、安全策略和可觀測(cè)性機(jī)制。
它們提供了一種標(biāo)準(zhǔn)化的方法來管理微服務(wù)之間的通信,使得在復(fù)雜的分布式系統(tǒng)中更容易監(jiān)控、保護(hù)和控制流量。
服務(wù)網(wǎng)格的組件

服務(wù)網(wǎng)格架構(gòu)通常涉及以下組件及其相互作用:
數(shù)據(jù)平面(Data Plane):數(shù)據(jù)平面指的是部署在每個(gè)服務(wù)實(shí)例旁邊的一組sidecar代理組成的網(wǎng)絡(luò),用于與系統(tǒng)中的其他服務(wù)進(jìn)行通信。它充當(dāng)服務(wù)與網(wǎng)絡(luò)的中間人。Sidecar代理處理入站和出站流量,攔截通信并提供其他功能。
?Sidecar(旁車):它基于Envoy代理。它是在同一Kubernetes POD中運(yùn)行的另一個(gè)容器,負(fù)責(zé)處理所有的橫切關(guān)注點(diǎn)。它基于旁車容器設(shè)計(jì)模式。?應(yīng)用程序流量:微服務(wù)通過使用sidecar容器連接到其他微服務(wù)。應(yīng)用程序流量基本上是Envoy sidecar代理容器之間的通信。?命名空間(Namespace):它是Kubernetes POD上的一個(gè)隔離空間,其中同時(shí)運(yùn)行旁車和微服務(wù)應(yīng)用程序。
控制平面(Control Plane):控制平面是服務(wù)網(wǎng)格的集中管理和配置層。它負(fù)責(zé)控制和協(xié)調(diào)sidecar代理的行為。它提供了一個(gè)控制平面API,允許管理員配置流量管理、安全性和可觀測(cè)性的策略、規(guī)則和設(shè)置。
?API端點(diǎn)(API Endpoints):API端點(diǎn)是網(wǎng)格中的服務(wù)之間進(jìn)行通信的入口點(diǎn)。?控制器(Controllers):控制器是負(fù)責(zé)管理和控制網(wǎng)格行為的組件。它通常是一個(gè)軟件組件,用于監(jiān)視服務(wù)的狀態(tài)和健康情況、配置流量路由和負(fù)載均衡規(guī)則、實(shí)施安全策略,并處理網(wǎng)格內(nèi)服務(wù)之間通信的其他方面。?服務(wù)發(fā)現(xiàn)(Service Discovery):服務(wù)發(fā)現(xiàn)是服務(wù)網(wǎng)格架構(gòu)中的一個(gè)重要組件。它使得服務(wù)能夠動(dòng)態(tài)地定位和連接到彼此,而無需硬編碼的地址。?證書授權(quán)機(jī)構(gòu)(Certificate Authority):它提供和管理根證書和中間證書,并執(zhí)行證書簽名操作。
應(yīng)用程序微服務(wù)(Application Microservices):這些是組成應(yīng)用程序的各個(gè)服務(wù)或微服務(wù)。它們負(fù)責(zé)處理特定的功能或任務(wù)。
用例:電子商務(wù)應(yīng)用程序
以電子商務(wù)應(yīng)用程序?yàn)槔?wù)網(wǎng)格將有助于管理負(fù)責(zé)不同功能的各種微服務(wù)之間的復(fù)雜網(wǎng)絡(luò)。
?Sidecar代理將處理負(fù)載均衡,確保流量在每個(gè)服務(wù)的多個(gè)實(shí)例之間高效分配。?此外,服務(wù)網(wǎng)格將通過強(qiáng)制使用TLS加密和身份驗(yàn)證來提供服務(wù)之間的安全通信。這有助于在傳輸過程中保護(hù)敏感的客戶信息,并防止對(duì)關(guān)鍵服務(wù)的未經(jīng)授權(quán)訪問。?流量管理功能將允許操作員控制和監(jiān)控請(qǐng)求的流動(dòng),使他們能夠執(zhí)行諸如將某些請(qǐng)求路由到服務(wù)的新版本進(jìn)行測(cè)試,或者限制傳入請(qǐng)求的速率以防止過載等任務(wù)。?服務(wù)網(wǎng)格的可觀測(cè)性和監(jiān)控功能將為操作員提供應(yīng)用程序性能的實(shí)時(shí)洞察,使他們能夠及時(shí)發(fā)現(xiàn)和解決問題。?他們可以分析指標(biāo)、日志和跟蹤以優(yōu)化應(yīng)用程序的性能,排除問題,并確保順暢的客戶體驗(yàn)。
總而言之,服務(wù)網(wǎng)格簡(jiǎn)化了分布式應(yīng)用程序的管理,并增強(qiáng)了應(yīng)用程序的彈性、安全性和可觀察性,成為現(xiàn)代微服務(wù)架構(gòu)中的重要組件。
服務(wù)網(wǎng)格解決了哪些問題?
服務(wù)網(wǎng)格在現(xiàn)代應(yīng)用程序架構(gòu)的背景下解決了幾個(gè)問題。以下是服務(wù)網(wǎng)格解決的一些關(guān)鍵問題:
1.服務(wù)之間的通信:在微服務(wù)
架構(gòu)中,應(yīng)用程序由多個(gè)獨(dú)立的服務(wù)組成,這些服務(wù)需要彼此進(jìn)行通信。服務(wù)網(wǎng)格提供了一個(gè)專用的基礎(chǔ)架構(gòu)層來處理服務(wù)之間的通信,使得管理和保護(hù)這些交互變得更加容易。
1.服務(wù)發(fā)現(xiàn)和負(fù)載均衡:隨著服務(wù)數(shù)量的增加,跟蹤它們的位置并有效地分發(fā)流量變得具有挑戰(zhàn)性。服務(wù)網(wǎng)格提供了服務(wù)發(fā)現(xiàn)和負(fù)載均衡的功能,允許服務(wù)動(dòng)態(tài)地發(fā)現(xiàn)和連接到彼此,并自動(dòng)將流量負(fù)載分布到多個(gè)實(shí)例上。2.流量管理和路由:服務(wù)網(wǎng)格實(shí)現(xiàn)了復(fù)雜的流量管理和路由功能,例如基于服務(wù)版本、路徑、標(biāo)頭或其他屬性的請(qǐng)求路由。它允許進(jìn)行流量轉(zhuǎn)移、金絲雀部署和A/B測(cè)試,使團(tuán)隊(duì)能夠輕松實(shí)施復(fù)雜的部署策略。3.彈性和容錯(cuò)性:服務(wù)網(wǎng)格提供了實(shí)現(xiàn)彈性和容錯(cuò)性模式的機(jī)制,例如重試、超時(shí)、斷路和負(fù)載限制。這些功能幫助服務(wù)優(yōu)雅地處理故障,隔離問題,并防止系統(tǒng)中的級(jí)聯(lián)故障。4.可觀察性和調(diào)試:服務(wù)網(wǎng)格為開發(fā)人員提供了強(qiáng)大的可觀察性功能,例如分布式跟蹤、指標(biāo)收集和日志記錄。這些功能幫助開發(fā)人員了解其服務(wù)的行為和性能,可以調(diào)試問題、跨服務(wù)邊界跟蹤請(qǐng)求,并優(yōu)化應(yīng)用程序的性能。5.安全性和身份驗(yàn)證:服務(wù)網(wǎng)格通過提供傳輸層加密(TLS)、相互身份驗(yàn)證和授權(quán)策略等功能來增強(qiáng)微服務(wù)架構(gòu)的安全性。它允許進(jìn)行細(xì)粒度的訪問控制和身份管理,提高系統(tǒng)的整體安全性。6.源代碼的緊密耦合:云配置通常與業(yè)務(wù)邏輯源代碼緊密耦合,這使得管理和調(diào)試任何代碼問題都會(huì)變得繁重。這可能使得添加新的業(yè)務(wù)功能、插入附加代碼和解決問題變得困難。然而,采用服務(wù)網(wǎng)格架構(gòu)可以將橫切關(guān)注點(diǎn)與業(yè)務(wù)邏輯源代碼分離。通過采用這種方法,服務(wù)網(wǎng)格通過DevOps平臺(tái)/基礎(chǔ)架構(gòu)團(tuán)隊(duì)的協(xié)作,獨(dú)立處理所有應(yīng)用程序配置。7.橫切配置關(guān)注點(diǎn)的測(cè)試負(fù)擔(dān):在集成、回歸和負(fù)載測(cè)試期間測(cè)試新功能,需要額外的測(cè)試工作量。對(duì)于業(yè)務(wù)邏輯的微小變更,即使是交叉配置代碼,也需要測(cè)試整個(gè)代碼庫。通過采用服務(wù)網(wǎng)格的方法,業(yè)務(wù)邏輯代碼變得更加簡(jiǎn)潔和簡(jiǎn)化,從而實(shí)現(xiàn)更輕松、更快速的測(cè)試。此外,開發(fā)人員發(fā)現(xiàn)編寫較少的JUnit和集成測(cè)試用例更加簡(jiǎn)單。8.應(yīng)用程序性能問題:當(dāng)業(yè)務(wù)邏輯和交叉配置組合在一起時(shí),它們需要額外的時(shí)間來加載、部署和在應(yīng)用容器上運(yùn)行。即使是業(yè)務(wù)特定的API調(diào)用也會(huì)消耗額外的CPU和內(nèi)存,這可能導(dǎo)致性能問題。相比之下,服務(wù)網(wǎng)格利用一個(gè)專門的旁車容器來運(yùn)行交叉配置關(guān)注點(diǎn)的配置代碼。這減輕了主應(yīng)用容器的負(fù)荷,從而提高了應(yīng)用程序的性能。通過僅運(yùn)行精簡(jiǎn)的應(yīng)用業(yè)務(wù)邏輯,可以增強(qiáng)性能。
在選擇服務(wù)網(wǎng)格時(shí)應(yīng)關(guān)注哪些關(guān)鍵特性?
?連接Kubernetes集群:如果與Google Anthos、Azure Arc、AWS Outpost、VMware Tanzu Mission Control(TMC)等混合云技術(shù)一起使用,它可以在兩個(gè)或多個(gè)Kubernetes集群之間提供連接。它可以跨本地、私有和公共云提供商進(jìn)行擴(kuò)展。?帶有Ingress Controller和Ingress資源的服務(wù)發(fā)現(xiàn):它提供了動(dòng)態(tài)的服務(wù)發(fā)現(xiàn)和路由,可以在具有不同動(dòng)態(tài)IP地址的多個(gè)云上的K8s集群之間分發(fā)分布式微服務(wù)REST API。它通過Ingress Controller和Ingress資源公開服務(wù)名來暴露服務(wù),這些服務(wù)可以被任何客戶端或消費(fèi)者使用。Ingress資源提供了對(duì)各種服務(wù)的路由詳細(xì)信息,Ingress控制器使用Ingress資源將傳入請(qǐng)求路由到API。?斷路器彈性:如果依賴的服務(wù)沒有響應(yīng)第一次嘗試,斷路器提供了重試機(jī)制。服務(wù)網(wǎng)格通過斷路器提供了強(qiáng)大的功能,當(dāng)依賴的服務(wù)在給定的估計(jì)時(shí)間內(nèi)沒有響應(yīng)時(shí)。由于這個(gè)機(jī)制,微服務(wù)對(duì)停機(jī)時(shí)間更具彈性,因?yàn)榉?wù)網(wǎng)格可以通過重新路由請(qǐng)求,使其遠(yuǎn)離失敗的服務(wù)。?微服務(wù)之間的API跟蹤:它提供了微服務(wù)的API跟蹤(API到API的交互)功能,跟蹤請(qǐng)求和響應(yīng)的交互日志。這種跟蹤有助于改善API的性能和SLA,并幫助開發(fā)人員調(diào)試和診斷錯(cuò)誤。?可觀測(cè)性:它提供了強(qiáng)大的機(jī)制來檢查應(yīng)用程序的健
康狀況和基礎(chǔ)資源使用情況,如CPU和內(nèi)存使用情況。它還收集應(yīng)用程序性能指標(biāo),并在Web儀表板上可視化。性能指標(biāo)可以提供在運(yùn)行時(shí)環(huán)境中優(yōu)化通信的方式。還可以監(jiān)視基礎(chǔ)架構(gòu)和應(yīng)用程序。
?數(shù)據(jù)有效負(fù)載安全性:它通過應(yīng)用雙向強(qiáng)大的mTLS安全加密技術(shù),在微服務(wù)API通信中提供數(shù)據(jù)傳輸時(shí)的數(shù)據(jù)加密。?API限流:它提供了一種機(jī)制來限制后端API調(diào)用的數(shù)量,防止分布式拒絕服務(wù)(DOS/DDOS)攻擊。在此類攻擊中,數(shù)千甚至數(shù)百萬個(gè)請(qǐng)求隨機(jī)命中后端API,導(dǎo)致整個(gè)后端軟件系統(tǒng)和基礎(chǔ)設(shè)施崩潰。?負(fù)載均衡:它通過使用內(nèi)置的Ingress Controller機(jī)制,將微服務(wù)暴露在Kubernetes集群上,作為通過Ingress控制器負(fù)載均衡器公開的外部服務(wù)。Ingress控制器可以根據(jù)Ingress資源將客戶端請(qǐng)求映射和路由到分布式微服務(wù)。
流行的服務(wù)網(wǎng)格
Istio(開源服務(wù)網(wǎng)格)
Istio是一個(gè)開源的服務(wù)網(wǎng)格平臺(tái),提供了一組工具和功能,用于管理和保護(hù)基于微服務(wù)的應(yīng)用程序。它旨在解決復(fù)雜分布式系統(tǒng)中與服務(wù)之間通信、可觀察性、安全性和流量管理相關(guān)的常見挑戰(zhàn)。在其核心,Istio在應(yīng)用程序中的每個(gè)微服務(wù)旁邊部署一個(gè)稱為Envoy的sidecar代理。這個(gè)sidecar代理攔截和管理服務(wù)的所有入站和出站流量,使得Istio可以控制和監(jiān)控服務(wù)之間的通信。
優(yōu)點(diǎn):
?Istio擁有龐大的在線服務(wù)網(wǎng)格社區(qū),并且在互聯(lián)網(wǎng)上備受贊譽(yù)和討論。其GitHub的貢獻(xiàn)者遠(yuǎn)遠(yuǎn)超過Linkerd,數(shù)量上占據(jù)優(yōu)勢(shì)。?此外,它支持Kubernetes和VM模式。
缺點(diǎn):
?Istio并非免費(fèi)提供,使用它需要相當(dāng)大的時(shí)間投入,包括閱讀文檔、設(shè)置、確保正常功能和持續(xù)維護(hù)。?在生產(chǎn)環(huán)境中實(shí)施和集成Istio可能需要幾周甚至幾個(gè)月的時(shí)間,這取決于基礎(chǔ)架構(gòu)的復(fù)雜性。?使用Istio需要相當(dāng)大的資源開銷。?與Linkerd不同,它缺乏內(nèi)置的管理儀表板。?此外,Istio要求使用其自己的入口網(wǎng)關(guān)。?Istio控制平面僅在Kubernetes容器中受支持,沒有可用于Istio數(shù)據(jù)平面的VM模式。
Linkerd
Linkerd是一個(gè)開源的服務(wù)網(wǎng)格平臺(tái),旨在為微服務(wù)架構(gòu)提供可觀察性、可靠性和安全性。它由云原生計(jì)算基金會(huì)(CNCF)開發(fā),注重簡(jiǎn)單性、性能和易用性。
優(yōu)點(diǎn):
?Linkerd借鑒了其創(chuàng)作者的經(jīng)驗(yàn),他們是Twitter的前工程師,曾開發(fā)過內(nèi)部工具Finagle。他們從Linkerd v1的開發(fā)經(jīng)驗(yàn)中獲得了寶貴的見解,這有助于改進(jìn)服務(wù)網(wǎng)格。?作為最早的服務(wù)網(wǎng)格之一,Linkerd擁有一個(gè)活躍而充滿活力的社區(qū),在Slack上擁有超過5000名用戶,以及一個(gè)活躍的郵件列表和Discord服務(wù)器。?詳盡的文檔和教程的可用性進(jìn)一步增強(qiáng)了它的吸引力。?Linkerd通過Buoyant提供付費(fèi)的企業(yè)級(jí)支持,確保專業(yè)幫助隨時(shí)可得。
缺點(diǎn):
?充分發(fā)揮Linkerd服務(wù)網(wǎng)格的潛力需要相當(dāng)大的學(xué)習(xí)曲線。需要注意的是,Linkerd僅在Kubernetes容器中受支持,不提供VM模式或“通用”模式。?與Envoy不同,Linkerd的sidecar代理有所不同,這使得Buoyant能夠根據(jù)自己的需求進(jìn)行優(yōu)化。然而,這種定制化是以失去Envoy提供的內(nèi)在可擴(kuò)展性為代價(jià)的。?因此,Linkerd不支持關(guān)鍵功能,如斷路、延遲注入和速率限制。此外,它沒有直接暴露用于輕松控制Linkerd控制平面的API,盡管可以找到一個(gè)gRPC API綁定。
除了上述比較,市場(chǎng)上還有許多選項(xiàng)供您選擇,例如:
?NGINX?Tanzu Service Mesh(TSM)?Tetrate Service Bridge(TSB)?Google Anthos?Azure Mesh?AWS App Mesh?HAProxy?Envoy?Traefik
結(jié)論
服務(wù)網(wǎng)格技術(shù)對(duì)開發(fā)人員來說是一個(gè)福音。它通過將橫切關(guān)注點(diǎn)從應(yīng)用程序源代碼委派給內(nèi)部DevSecOps,提高了開發(fā)人員的生產(chǎn)力。服務(wù)網(wǎng)格為解決開發(fā)人員的挑戰(zhàn)和提高開發(fā)人員的生產(chǎn)力提供了大量更多的功能。對(duì)于在Kubernetes上構(gòu)建云原生微服務(wù)應(yīng)用程序來說,服務(wù)網(wǎng)格現(xiàn)在是一種事實(shí)上的標(biāo)準(zhǔn)。