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