服務(wù)網(wǎng)格(Service Mesh)為服務(wù)通信帶來了安全性、彈性、可見性,因此使開發(fā)人員不必做這些。
IT在數(shù)字化轉(zhuǎn)型趨勢(shì)下發(fā)生的變化之一是將大型單片應(yīng)用程序分解為微服務(wù),這些小型的、離散的功能單元在容器中運(yùn)行,其軟件包包括服務(wù)所有代碼,并可以被隔離,輕松地從一個(gè)服務(wù)器移動(dòng)到另一個(gè)服務(wù)器。
像這樣的容器化架構(gòu)很容易在云中進(jìn)行擴(kuò)展和運(yùn)行,并且可以快速部署和迭代各個(gè)微服務(wù)。然而,隨著應(yīng)用程序的規(guī)模變得越來越大,同一服務(wù)的多個(gè)實(shí)例同時(shí)運(yùn)行,這些微服務(wù)之間的通信變得越來越復(fù)雜。服務(wù)網(wǎng)格是一種新興的架構(gòu)形式,旨在以減少管理和編程開銷的方式動(dòng)態(tài)連接這些微服務(wù)。
什么是服務(wù)網(wǎng)格? 從最廣泛的意義上講,“服務(wù)網(wǎng)格”正如Red Hat公司所描述的那樣,“服務(wù)網(wǎng)格是一種控制應(yīng)用程序的不同部分如何共享數(shù)據(jù)的方法。” 不過這個(gè)描述可能包含很多不同的東西。事實(shí)上,它聽起來很像大多數(shù)開發(fā)人員所熟悉的來自客戶端-服務(wù)器應(yīng)用程序的中間件。
服務(wù)網(wǎng)格的獨(dú)特之處在于,它是為適應(yīng)分布式微服務(wù)環(huán)境的獨(dú)特性質(zhì)而構(gòu)建的。在由微服務(wù)構(gòu)建的大型應(yīng)用程序中,可能存在給定服務(wù)的多個(gè)實(shí)例,它們運(yùn)行在不同的本地或云計(jì)算服務(wù)器上。顯然,所有這些移動(dòng)部件都使得單個(gè)微服務(wù)很難找到他們需要與之通信的其他服務(wù)。服務(wù)網(wǎng)格會(huì)自動(dòng)處理即時(shí)發(fā)現(xiàn)和連接服務(wù),這樣開發(fā)人員和微服務(wù)都不必這樣做。
將服務(wù)網(wǎng)格視為開放式系統(tǒng)互聯(lián)(OSI)網(wǎng)絡(luò)模型的第7級(jí)軟件定義網(wǎng)絡(luò)(SDN)的等效物。正如軟件定義網(wǎng)絡(luò)(SDN)創(chuàng)建一個(gè)抽象層,因此網(wǎng)絡(luò)管理員不必處理物理網(wǎng)絡(luò)連接,服務(wù)網(wǎng)格將應(yīng)用程序的底層基礎(chǔ)結(jié)構(gòu)與企業(yè)交互的抽象體系結(jié)構(gòu)分離。
隨著開發(fā)人員開始努力解決真正龐大的分布式架構(gòu)的問題,服務(wù)網(wǎng)格的概念出現(xiàn)了。 Linkerd是該領(lǐng)域的第一個(gè)項(xiàng)目,誕生于Twitter內(nèi)部項(xiàng)目的分支。Istio是另一個(gè)受歡迎的服務(wù)網(wǎng)絡(luò),擁有主要的企業(yè)支持,起源于Lyft。
服務(wù)網(wǎng)格負(fù)載平衡 服務(wù)網(wǎng)格提供的一個(gè)關(guān)鍵特性是負(fù)載平衡。人們通常將負(fù)載均衡視為網(wǎng)絡(luò)功能,企業(yè)希望防止任何一個(gè)服務(wù)器或網(wǎng)絡(luò)鏈路被流量淹沒,因此可以相應(yīng)地路由其數(shù)據(jù)包。正如Twain Taylor所描述的那樣,服務(wù)網(wǎng)格在應(yīng)用程序級(jí)別上做了類似的事情,理解這一點(diǎn)可以讓人們很好地理解服務(wù)網(wǎng)格就像是應(yīng)用程序?qū)拥能浖x的網(wǎng)絡(luò)。
本質(zhì)上,服務(wù)網(wǎng)格的一個(gè)工作是跟蹤分布在基礎(chǔ)設(shè)施上的各種微服務(wù)的哪些實(shí)例是“最健康的”。它可能會(huì)輪詢以查看它們是如何做的,或跟蹤哪些實(shí)例響應(yīng)緩慢服務(wù)請(qǐng)求,并將后續(xù)請(qǐng)求發(fā)送到其他實(shí)例。服務(wù)網(wǎng)格可以為網(wǎng)絡(luò)路由執(zhí)行類似的工作,注意到消息需要很長(zhǎng)時(shí)間才能到達(dá)目的地,并采取其他路由進(jìn)行補(bǔ)償。這些速度慢的原因可能是底層硬件的問題,或者僅僅是服務(wù)被請(qǐng)求超載。重要的是,服務(wù)網(wǎng)格可以找到相同服務(wù)的另一個(gè)實(shí)例,并將其路由到該實(shí)例,從而最有效地利用整個(gè)應(yīng)用程序的容量。
服務(wù)網(wǎng)格與Kubernetes 如果人們對(duì)基于容器的架構(gòu)有些了解,那么可能想知道Kubernetes(流行的開源容器編排平臺(tái))適合這種情況。畢竟,Kubernetes管理容器之間如何通信不是其全部要點(diǎn)嗎?正如Kublr公司在其企業(yè)博客上指出的那樣,可以將Kubernetes的服務(wù)資源視為一種非常基本的服務(wù)網(wǎng)絡(luò),因?yàn)樗峁┓?wù)發(fā)現(xiàn)和循環(huán)請(qǐng)求平衡。但是功能齊全的服務(wù)網(wǎng)格提供了更多功能,如管理安全策略和加密,“線路中斷”以暫停對(duì)慢響應(yīng)實(shí)例的請(qǐng)求。
人們需要了解的是,大多數(shù)服務(wù)網(wǎng)格確實(shí)需要像Kubernetes這樣的編排系統(tǒng)。服務(wù)網(wǎng)格提供擴(kuò)展功能,而不是替代功能。
服務(wù)網(wǎng)格與API網(wǎng)關(guān) 每個(gè)微服務(wù)都將提供一個(gè)應(yīng)用程序編程接口(API),作為其他服務(wù)與之通信的手段。這引發(fā)了服務(wù)網(wǎng)格與其他更傳統(tǒng)的API管理形式(如API網(wǎng)關(guān))之間的差異問題。正如IBM公司解釋的那樣,VPS租用,API網(wǎng)關(guān)位于一組微服務(wù)和外部世界之間,根據(jù)需要路由服務(wù)請(qǐng)求,以便請(qǐng)求者不需要知道它正在處理基于微服務(wù)的應(yīng)用程序。另一方面,服務(wù)網(wǎng)格調(diào)解微服務(wù)應(yīng)用程序內(nèi)部的請(qǐng)求,并需要用戶完全了解其環(huán)境。
正如Justin Warren所指出的那樣,另一種思考方式是服務(wù)網(wǎng)格用于集群內(nèi)的東西向流量,而API網(wǎng)關(guān)用于進(jìn)出集群的南北流量。但服務(wù)網(wǎng)格的想法仍處于早期階段,并且不斷變化。許多服務(wù)網(wǎng)格(包括Linkerd和Istio)現(xiàn)在也提供南北向流量功能。