一篇聊透云原生中的服務(wù)網(wǎng)格
服務(wù)網(wǎng)格
服務(wù)網(wǎng)格是一種軟件架構(gòu)模式,用于管理和連接微服務(wù)架構(gòu)中的服務(wù)。它提供了一種方法,使得微服務(wù)之間的通信變得更加可靠、安全和靈活。服務(wù)網(wǎng)格通常由一組輕量級的代理程序組成,這些代理程序負(fù)責(zé)處理服務(wù)之間的通信,管理流量、安全性、監(jiān)控和其他相關(guān)的任務(wù)。它們還可以提供諸如負(fù)載均衡、故障轉(zhuǎn)移和自動伸縮等功能,從而幫助確保整個(gè)微服務(wù)架構(gòu)的可靠性和可伸縮性。Istio 和 Linkerd 是兩個(gè)常見的服務(wù)網(wǎng)格實(shí)現(xiàn)。
圖片
特點(diǎn)
作為應(yīng)用程序間通信的中間層
- 服務(wù)網(wǎng)格充當(dāng)了應(yīng)用程序之間通信的中間層。它們位于微服務(wù)架構(gòu)中服務(wù)之間的通信路徑上,負(fù)責(zé)管理和控制所有的通信流量。
- 這種中間層的存在使得服務(wù)之間的通信變得更加可靠,因?yàn)樗鼈兛梢蕴幚硗ㄐ胖械脑S多復(fù)雜性,例如負(fù)載均衡、故障轉(zhuǎn)移和安全性等。
輕量級網(wǎng)絡(luò)代理
- 服務(wù)網(wǎng)格通常由輕量級的網(wǎng)絡(luò)代理組成,這些代理直接嵌入到應(yīng)用程序或者與應(yīng)用程序運(yùn)行在同一主機(jī)上。
- 這些代理負(fù)責(zé)攔截和處理服務(wù)之間的所有通信,執(zhí)行所需的功能,例如流量管理、安全性、監(jiān)控等。
應(yīng)用程序無感知
- 服務(wù)網(wǎng)格的設(shè)計(jì)目標(biāo)之一是使得應(yīng)用程序無需感知網(wǎng)格的存在。應(yīng)用程序可以專注于自己的業(yè)務(wù)邏輯,而無需處理底層的通信細(xì)節(jié)。
- 這種無感知性意味著在將應(yīng)用程序部署到服務(wù)網(wǎng)格中時(shí),不需要對應(yīng)用程序進(jìn)行任何修改。
解耦應(yīng)用程序的重試/超時(shí)、監(jiān)控、追蹤和服務(wù)發(fā)現(xiàn)
- 服務(wù)網(wǎng)格解耦了與通信相關(guān)的許多關(guān)注點(diǎn),包括重試、超時(shí)、監(jiān)控、追蹤和服務(wù)發(fā)現(xiàn)等。
- 通過將這些功能從應(yīng)用程序中抽象出來并集中管理,服務(wù)網(wǎng)格可以提供統(tǒng)一的解決方案來處理這些問題,從而降低了應(yīng)用程序開發(fā)人員的負(fù)擔(dān),并提高了整個(gè)架構(gòu)的可維護(hù)性和可靠性。
功能
服務(wù)發(fā)現(xiàn)
- 服務(wù)網(wǎng)格可以自動發(fā)現(xiàn)和注冊微服務(wù)實(shí)例,并將它們的位置信息存儲在服務(wù)注冊表中。這使得其他服務(wù)能夠動態(tài)地找到并與所需的服務(wù)進(jìn)行通信,而無需硬編碼服務(wù)的位置信息。
負(fù)載均衡
- 服務(wù)網(wǎng)格可以根據(jù)預(yù)先定義的負(fù)載均衡策略,將請求均勻地分配到可用的服務(wù)實(shí)例上。這有助于提高系統(tǒng)的性能和可伸縮性,確保每個(gè)服務(wù)實(shí)例都能夠有效地處理流量。
加密通信
- 通過加密通信功能,服務(wù)網(wǎng)格可以確保微服務(wù)之間的通信是安全的。它可以使用諸如TLS(傳輸層安全性)等加密協(xié)議來加密通信流量,以防止敏感數(shù)據(jù)在傳輸過程中被竊取或篡改。
觀察與追蹤微服務(wù)之間的拓?fù)?/h4>- 服務(wù)網(wǎng)格可以提供觀察和追蹤微服務(wù)之間通信拓?fù)涞墓δ?。這包括監(jiān)控服務(wù)之間的通信模式、識別潛在的性能瓶頸和故障點(diǎn),并提供實(shí)時(shí)的監(jiān)控指標(biāo)和分析報(bào)告。
服務(wù)之間訪問的鑒權(quán)與授權(quán)
- 通過鑒權(quán)與授權(quán)功能,服務(wù)網(wǎng)格可以確保只有經(jīng)過授權(quán)的服務(wù)和用戶才能夠訪問特定的服務(wù)。它可以實(shí)施訪問控制策略,例如基于角色的訪問控制(RBAC)或令牌驗(yàn)證,以確保服務(wù)之間的安全通信。
熔斷機(jī)制
- 熔斷機(jī)制是服務(wù)網(wǎng)格提供的一種故障處理機(jī)制,用于防止故障的傳播和影響系統(tǒng)的穩(wěn)定性。當(dāng)檢測到某個(gè)服務(wù)出現(xiàn)故障或響應(yīng)時(shí)間超過閾值時(shí),熔斷機(jī)制可以暫時(shí)停止將流量發(fā)送到該服務(wù),以避免對整個(gè)系統(tǒng)產(chǎn)生負(fù)面影響。
數(shù)據(jù)平面
通過接收控制面發(fā)送的路由與控制信息來定向轉(zhuǎn)發(fā)或處理數(shù)據(jù)。
當(dāng)談到服務(wù)網(wǎng)格時(shí),這些特點(diǎn)是其核心功能之一,它們通過數(shù)據(jù)面和控制面的配合來實(shí)現(xiàn)。
服務(wù)發(fā)現(xiàn)
- 服務(wù)網(wǎng)格通過服務(wù)發(fā)現(xiàn)功能來發(fā)現(xiàn)后端服務(wù)實(shí)例中哪些是可用的。這意味著當(dāng)新的服務(wù)實(shí)例被部署或舊的實(shí)例被移除時(shí),服務(wù)網(wǎng)格能夠自動檢測到這些變化并更新服務(wù)發(fā)現(xiàn)的信息。
健康檢查
- 健康檢查功能允許服務(wù)網(wǎng)格定期向服務(wù)發(fā)送心跳,以檢測服務(wù)實(shí)例是否存活。如果服務(wù)實(shí)例未能及時(shí)響應(yīng)健康檢查請求,服務(wù)網(wǎng)格將其標(biāo)記為不可用,并停止將流量發(fā)送到該實(shí)例。
鑒權(quán)
- 通過鑒權(quán)功能,服務(wù)網(wǎng)格可以對訪問請求進(jìn)行加解密驗(yàn)證,以確保只有經(jīng)過授權(quán)的請求才能夠訪問服務(wù)。這有助于保護(hù)服務(wù)免受未經(jīng)授權(quán)的訪問或攻擊。
負(fù)載均衡
- 負(fù)載均衡功能使服務(wù)網(wǎng)格能夠?qū)Χ鄠€(gè)下游服務(wù)進(jìn)行流量的均衡分配。這確保了在負(fù)載增加時(shí),流量能夠被有效地分發(fā)到各個(gè)服務(wù)實(shí)例上,從而提高了系統(tǒng)的性能和可用性。
流量統(tǒng)計(jì)
- 通過流量統(tǒng)計(jì)功能,服務(wù)網(wǎng)格可以對每個(gè)請求的流量進(jìn)行統(tǒng)計(jì),并生成相應(yīng)的監(jiān)控?cái)?shù)據(jù)和追蹤信息。這些統(tǒng)計(jì)數(shù)據(jù)可以用于分析系統(tǒng)的性能、診斷問題和優(yōu)化服務(wù)架構(gòu)。
熔斷限流
- 熔斷限流功能允許服務(wù)網(wǎng)格確定最大的查詢率(QPS)、最大并發(fā)數(shù)等限制,并在達(dá)到這些限制時(shí)拒絕新的請求。這有助于保護(hù)后端服務(wù)免受過載的影響,并提高整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。
數(shù)據(jù)面和控制面的配合
- 數(shù)據(jù)面主要負(fù)責(zé)接收系統(tǒng)中的每個(gè)請求和包,并根據(jù)預(yù)先配置的規(guī)則和策略來處理流量。常見的數(shù)據(jù)面包括Envoy、HAProxy、Nginx等。
- 控制面則負(fù)責(zé)管理和配置數(shù)據(jù)面,包括配置服務(wù)發(fā)現(xiàn)、健康檢查、鑒權(quán)規(guī)則、負(fù)載均衡策略等。常見的控制面包括Istio、SmartStack等。控制面與數(shù)據(jù)面的配合使得服務(wù)網(wǎng)格能夠靈活地管理和控制服務(wù)之間的通信,實(shí)現(xiàn)高度可靠和可擴(kuò)展的微服務(wù)架構(gòu)。
控制面
服務(wù)網(wǎng)格的控制面是指服務(wù)網(wǎng)格架構(gòu)中負(fù)責(zé)管理和配置數(shù)據(jù)面的部分。它通常由一組組件組成,這些組件負(fù)責(zé)實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)、流量管理、安全控制、監(jiān)控、故障處理等功能??刂泼娴闹饕蝿?wù)是為數(shù)據(jù)面提供所需的配置信息,以確保服務(wù)網(wǎng)格能夠按照預(yù)期的方式運(yùn)行,并滿足各種業(yè)務(wù)需求和運(yùn)維要求。
圖片
服務(wù)發(fā)現(xiàn)
管理和維護(hù)服務(wù)注冊表,跟蹤服務(wù)實(shí)例的可用性和位置,以便數(shù)據(jù)面能夠?qū)⒘髁空_地路由到目標(biāo)服務(wù)。
流量管理
配置負(fù)載均衡、路由規(guī)則、限流策略等,以確保流量能夠按照預(yù)期的方式在服務(wù)之間進(jìn)行傳輸,并保證服務(wù)的可用性和性能。
安全控制
實(shí)施安全策略,例如認(rèn)證、授權(quán)、加密解密等,以保護(hù)服務(wù)之間的通信安全,并防止未經(jīng)授權(quán)的訪問和數(shù)據(jù)泄露。
監(jiān)控和指標(biāo)收集
收集和分析服務(wù)之間的通信數(shù)據(jù)、性能指標(biāo)和錯(cuò)誤信息,以便進(jìn)行故障診斷、性能優(yōu)化和資源規(guī)劃。
故障處理
實(shí)施故障檢測、熔斷、重試等機(jī)制,以確保在服務(wù)發(fā)生故障或不可用時(shí)能夠及時(shí)地進(jìn)行處理,保障整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。
常見的服務(wù)網(wǎng)格控制面包括 Istio、Linkerd 控制平面等。這些控制面組件通常以集群部署方式運(yùn)行,與數(shù)據(jù)面組件(如 Envoy、HAProxy 等)協(xié)同工作,共同構(gòu)建出高度可靠和高度可擴(kuò)展的服務(wù)網(wǎng)格架構(gòu)。
服務(wù)網(wǎng)格的優(yōu)點(diǎn)
解耦微服務(wù)業(yè)務(wù)架構(gòu)和服務(wù)控制
服務(wù)網(wǎng)格實(shí)現(xiàn)了微服務(wù)業(yè)務(wù)邏輯與底層服務(wù)控制的解耦。微服務(wù)只需專注于實(shí)現(xiàn)自己的業(yè)務(wù)邏輯,而不必在代碼中繁瑣配置與服務(wù)通信相關(guān)的依賴庫和配置項(xiàng)。這種解耦使得微服務(wù)開發(fā)更加簡潔和高效。
抽象共性需求,統(tǒng)一實(shí)現(xiàn)
服務(wù)網(wǎng)格將微服務(wù)中常見的共性需求(如流量統(tǒng)計(jì)、trace埋點(diǎn)、限流控制等)抽象出來,作為統(tǒng)一的實(shí)現(xiàn)層。這些功能由基礎(chǔ)架構(gòu)團(tuán)隊(duì)負(fù)責(zé)實(shí)現(xiàn),并通過服務(wù)網(wǎng)格的統(tǒng)一部署方式,為所有微服務(wù)提供支持。這樣一來,不同微服務(wù)間不再需要重復(fù)編碼這些通用功能,極大地提高了開發(fā)效率和代碼復(fù)用性。
業(yè)務(wù)開發(fā)者專注于業(yè)務(wù)邏輯
有了服務(wù)網(wǎng)格,業(yè)務(wù)開發(fā)者不再需要分心關(guān)注微服務(wù)的共性需求和底層服務(wù)控制,可以更專注地投入到業(yè)務(wù)邏輯的實(shí)現(xiàn)上。這使得開發(fā)人員能夠更快速、高效地迭代業(yè)務(wù)功能,加速產(chǎn)品上線和迭代。
統(tǒng)一升級和維護(hù)
服務(wù)網(wǎng)格的統(tǒng)一實(shí)現(xiàn)層由基礎(chǔ)架構(gòu)團(tuán)隊(duì)負(fù)責(zé)升級和維護(hù),業(yè)務(wù)開發(fā)者無需擔(dān)心底層服務(wù)控制的變化和更新。這降低了微服務(wù)的維護(hù)成本,同時(shí)保證了整個(gè)微服務(wù)架構(gòu)的穩(wěn)定性和可靠性。
提升組織效率
通過將共性需求抽象為服務(wù)網(wǎng)格的統(tǒng)一實(shí)現(xiàn)層,并由基礎(chǔ)架構(gòu)團(tuán)隊(duì)統(tǒng)一維護(hù),服務(wù)網(wǎng)格提高了組織的整體效率。業(yè)務(wù)開發(fā)者能夠更專注于業(yè)務(wù)功能的實(shí)現(xiàn),基礎(chǔ)架構(gòu)團(tuán)隊(duì)則負(fù)責(zé)提供穩(wěn)定可靠的底層服務(wù)控制,使得整個(gè)組織能夠更快速、高效地實(shí)現(xiàn)業(yè)務(wù)目標(biāo)。
服務(wù)網(wǎng)格的技術(shù)棧
服務(wù)網(wǎng)格的技術(shù)棧通常包括以下幾個(gè)方面的技術(shù)和工具
代理和數(shù)據(jù)面
- 代理和數(shù)據(jù)面組件負(fù)責(zé)處理服務(wù)之間的通信流量,執(zhí)行負(fù)載均衡、安全性、監(jiān)控等功能。
Envoy
HAProxy
NGINX
控制面
- 控制面負(fù)責(zé)管理和配置數(shù)據(jù)面,實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)、流量管理、安全控制、監(jiān)控等功能。
Istio
Linkerd
Consul
監(jiān)控和指標(biāo)收集
- 監(jiān)控和指標(biāo)收集組件用于收集和分析服務(wù)之間的通信數(shù)據(jù)、性能指標(biāo)和錯(cuò)誤信息。
Prometheus
Grafana
Zipkin
Jaeger
安全性和鑒權(quán)
- 安全性和鑒權(quán)組件用于實(shí)現(xiàn)對服務(wù)之間通信的加密、認(rèn)證和授權(quán)。
JWT(JSON Web Token)
OAuth2
SPIFFE(Secure Production Identity Framework for Everyone)
服務(wù)發(fā)現(xiàn)
- 服務(wù)發(fā)現(xiàn)組件用于發(fā)現(xiàn)和注冊微服務(wù)實(shí)例,以便其他服務(wù)能夠動態(tài)地找到并與它們進(jìn)行通信。常見的服務(wù)發(fā)現(xiàn)工具包括
Consul
etcd
ZooKeeper
流量管理
- 流量管理組件用于配置負(fù)載均衡、路由規(guī)則、限流策略等,以確保流量能夠按照預(yù)期的方式在服務(wù)之間進(jìn)行傳輸。
Kong
Traefik
Ambassador
熔斷和故障處理
- 熔斷和故障處理組件用于實(shí)現(xiàn)故障檢測、熔斷、重試等機(jī)制,以確保在服務(wù)出現(xiàn)故障或不可用時(shí)能夠進(jìn)行適當(dāng)?shù)奶幚怼?/li>
Hystrix
Istio Circuit Breaker
我們來總結(jié)一下,服務(wù)網(wǎng)格的技術(shù)棧涵蓋了代理和數(shù)據(jù)面、控制面、監(jiān)控和指標(biāo)收集、安全性和鑒權(quán)、服務(wù)發(fā)現(xiàn)、流量管理以及熔斷和故障處理等方面的技術(shù)和工具。
技術(shù)棧圖
我們可以使用plantuml畫出對應(yīng)的用例圖
@startuml
left to right direction
actor 用戶 as User
package "服務(wù)網(wǎng)格技術(shù)棧" {
usecase "代理和數(shù)據(jù)面" as Proxy
usecase "控制面" as ControlPlane
usecase "監(jiān)控和指標(biāo)收集" as Monitoring
usecase "安全性和鑒權(quán)" as Security
usecase "服務(wù)發(fā)現(xiàn)" as ServiceDiscovery
usecase "流量管理" as TrafficManagement
usecase "熔斷和故障處理" as CircuitBreaker
User --> Proxy : 發(fā)送請求
User --> ControlPlane : 配置服務(wù)規(guī)則
User --> Monitoring : 查看監(jiān)控?cái)?shù)據(jù)
User --> Security : 進(jìn)行認(rèn)證和授權(quán)
User --> ServiceDiscovery : 發(fā)現(xiàn)可用服務(wù)
User --> TrafficManagement : 配置負(fù)載均衡
User --> CircuitBreaker : 設(shè)置故障處理策略
ControlPlane --> Proxy : 下發(fā)配置
ControlPlane --> Monitoring : 收集指標(biāo)
ControlPlane --> Security : 實(shí)施安全策略
ControlPlane --> ServiceDiscovery : 更新服務(wù)列表
ControlPlane --> TrafficManagement : 配置路由規(guī)則
ControlPlane --> CircuitBreaker : 觸發(fā)熔斷
Proxy --> ControlPlane : 上報(bào)狀態(tài)
Proxy --> Monitoring : 發(fā)送監(jiān)控?cái)?shù)據(jù)
Proxy --> Security : 執(zhí)行安全操作
Proxy --> ServiceDiscovery : 查詢服務(wù)列表
Proxy --> TrafficManagement : 處理流量策略
Proxy --> CircuitBreaker : 進(jìn)行故障檢測
Monitoring --> ControlPlane : 提供監(jiān)控?cái)?shù)據(jù)
Monitoring --> Proxy : 收集代理狀態(tài)
Monitoring --> Security : 記錄安全事件
Monitoring --> ServiceDiscovery : 分析服務(wù)拓?fù)? Monitoring --> TrafficManagement : 分析流量分布
Monitoring --> CircuitBreaker : 監(jiān)控故障情況
}
@enduml
圖片
這個(gè)用例圖描述了服務(wù)網(wǎng)格技術(shù)棧中各個(gè)組件之間的交互關(guān)系以及用戶如何使用這些技術(shù)來實(shí)現(xiàn)不同的功能。
用戶
表示使用服務(wù)網(wǎng)格的終端用戶或系統(tǒng)用戶,他們通過與不同的技術(shù)組件進(jìn)行交互,來達(dá)到他們的目標(biāo)。
代理和數(shù)據(jù)面
代表了處理服務(wù)之間通信流量的組件。它們與用戶交互,處理用戶發(fā)送的請求,并向控制面報(bào)告狀態(tài)。同時(shí),它們也與控制面、監(jiān)控和指標(biāo)收集、安全性和鑒權(quán)、服務(wù)發(fā)現(xiàn)、流量管理以及熔斷和故障處理等組件進(jìn)行交互,以執(zhí)行相應(yīng)的功能。
控制面
負(fù)責(zé)管理和配置數(shù)據(jù)面,實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)、流量管理、安全控制、監(jiān)控等功能。它接收來自用戶的配置請求,并將配置信息下發(fā)到數(shù)據(jù)面,同時(shí)收集來自數(shù)據(jù)面的狀態(tài)和監(jiān)控信息,以便進(jìn)行相應(yīng)的調(diào)整和優(yōu)化。
監(jiān)控和指標(biāo)收集
負(fù)責(zé)收集和分析服務(wù)之間的通信數(shù)據(jù)、性能指標(biāo)和錯(cuò)誤信息。它與用戶交互,提供監(jiān)控?cái)?shù)據(jù)給用戶查看,并與控制面、代理和數(shù)據(jù)面等組件進(jìn)行交互,以實(shí)現(xiàn)監(jiān)控和診斷功能。
安全性和鑒權(quán)
實(shí)施對服務(wù)之間通信的加密、認(rèn)證和授權(quán)。它與用戶進(jìn)行交互,執(zhí)行安全操作,并與控制面、代理和數(shù)據(jù)面等組件進(jìn)行交互,以保護(hù)服務(wù)之間的通信安全。
服務(wù)發(fā)現(xiàn)
負(fù)責(zé)發(fā)現(xiàn)和注冊微服務(wù)實(shí)例,以便其他服務(wù)能夠動態(tài)地找到并與它們進(jìn)行通信。它與用戶交互,提供服務(wù)發(fā)現(xiàn)功能,并與控制面、代理和數(shù)據(jù)面等組件進(jìn)行交互,以更新服務(wù)列表和服務(wù)拓?fù)洹?/p>
流量管理
負(fù)責(zé)配置負(fù)載均衡、路由規(guī)則、限流策略等,以確保流量能夠按照預(yù)期的方式在服務(wù)之間進(jìn)行傳輸。它與用戶進(jìn)行交互,提供流量管理功能,并與控制面、代理和數(shù)據(jù)面等組件進(jìn)行交互,以配置和調(diào)整流量策略。
熔斷和故障處理
負(fù)責(zé)實(shí)施故障檢測、熔斷、重試等機(jī)制,以確保在服務(wù)出現(xiàn)故障或不可用時(shí)能夠進(jìn)行適當(dāng)?shù)奶幚?。它與用戶進(jìn)行交互,提供熔斷和故障處理功能,并與控制面、代理和數(shù)據(jù)面等組件進(jìn)行交互,以監(jiān)控和處理故障情況。