一、引言
隨著微服務架構的廣泛應用,微服務之間的通信管理、流量控制、安全保障等問題變得日益復雜。服務網格(Service Mesh)作為一種新興的技術,為解決這些問題提供了有效的方案。它將服務間通信的管理從微服務代碼中分離出來,構建了一個專門用于處理服務間通信的基礎設施層。
二、服務網格的基本概念
(一)定義
服務網格是一個用于處理服務間通信的專用基礎設施層。它通過在每個服務實例旁邊部署一個代理(通常稱為sidecar代理),來實現對服務間通信的控制和管理。這些代理相互協作,形成一個網狀結構,從而實現諸如流量路由、負載均衡、服務發現、安全通信等功能。
(二)組成部分
數據平面(Data Plane)
由眾多的sidecar代理組成,負責處理實際的網絡流量,包括攔截進出服務實例的請求和響應,進行流量控制、日志記錄、監控數據采集等操作。例如,在一個電商微服務架構中,當用戶請求從產品服務到訂單服務時,數據平面的代理會攔截這個請求,根據配置的規則進行處理,如添加請求頭、進行流量限制等。
控制平面(Control Plane)
負責管理和配置數據平面的代理。它定義了服務間通信的策略,如路由策略、安全策略等,并將這些策略分發到各個sidecar代理。控制平面可以動態地調整這些策略,以適應微服務架構的變化。例如,當需要將一部分流量從舊版本的服務路由到新版本時,控制平面可以更新路由策略,并通知相應的代理執行新的路由規則。
三、服務網格在微服務架構中的應用
(一)流量管理
流量路由
服務網格可以根據多種條件進行流量路由,如根據請求的來源、請求的版本號或者用戶的特定標識等。例如,在一個多版本的微服務應用中,可以通過服務網格將10%的流量路由到新版本的服務進行測試,而將90%的流量保持在舊版本,以便進行漸進式的版本升級。
負載均衡
傳統的微服務負載均衡通常在服務發現組件或者客戶端代碼中實現,而服務網格將負載均衡功能下沉到sidecar代理。代理可以根據多種算法(如輪詢、加權輪詢、最少連接等)進行負載均衡。這使得負載均衡的策略更加靈活,并且可以根據實際的服務運行情況進行動態調整。例如,當某個服務實例的負載過高時,代理可以減少發送到該實例的流量。
(二)服務發現與注冊
動態服務發現
在微服務架構中,服務實例可能會頻繁地啟動、停止或遷移。服務網格的控制平面可以實時跟蹤服務實例的狀態,將服務發現的功能從微服務代碼中解耦出來。當一個新的服務實例啟動時,它可以自動被服務網格發現并注冊,其他服務可以通過服務網格輕松地找到這個新實例并與之通信。
跨環境服務發現
對于復雜的企業架構,可能存在多個不同的環境(如開發環境、測試環境、生產環境)。服務網格可以在這些不同環境之間實現統一的服務發現機制,使得在不同環境之間進行服務調用和集成更加方便。例如,在開發環境中對某個服務進行測試時,可以通過服務網格輕松地找到在測試環境中對應的服務實例。
(三)安全保障
加密通信
服務網格可以為服務間的通信提供加密功能,確保數據在傳輸過程中的安全性。sidecar代理可以在發送和接收數據時對數據進行加密和解密操作,防止數據被竊取或篡改。例如,在金融微服務架構中,涉及用戶資金信息的服務間通信可以通過服務網格進行加密,保護用戶的隱私和資金安全。
訪問控制
服務網格可以定義精細的訪問控制規則,確定哪些服務可以訪問其他服務,以及在什么條件下可以訪問。例如,可以設置只有經過身份驗證和授權的服務才能訪問包含敏感數據的服務,并且可以根據用戶的角色或權限進一步限制訪問的范圍。
(四)可觀測性
監控與指標采集
sidecar代理可以收集大量關于服務間通信的監控數據,如請求的延遲、吞吐量、錯誤率等。這些數據可以被匯總到監控系統中,幫助運維人員和開發人員全面了解微服務架構的運行狀態。例如,通過監控數據可以發現某個服務的請求延遲突然增加,從而及時排查問題。
分布式追蹤
服務網格可以實現分布式追蹤功能,跟蹤請求在多個微服務之間的傳播路徑。這有助于在復雜的微服務架構中定位問題的根源,例如當一個用戶請求在多個服務間傳遞后出現錯誤時,可以通過分布式追蹤確定是哪個服務或者哪個環節出現了問題。
四、服務網格的優勢
(一)解耦微服務通信邏輯
降低微服務復雜度
傳統微服務架構中,服務間通信的邏輯往往與業務邏輯混雜在一起,增加了微服務代碼的復雜度。服務網格將通信邏輯分離出來,使得微服務可以更加專注于自身的業務邏輯,提高了微服務的可維護性和可擴展性。例如,開發人員在編寫一個新的微服務時,不需要再考慮復雜的服務發現、負載均衡等通信相關的代碼。
語言和框架無關性
服務網格對微服務使用的編程語言和框架沒有限制。無論微服務是用Java、Python還是其他語言編寫,都可以利用服務網格提供的功能。這使得企業在構建微服務架構時可以更加靈活地選擇適合的技術棧。
(二)增強微服務架構的彈性
故障隔離與恢復
當某個服務實例出現故障時,服務網格可以通過動態調整流量路由,將請求繞過故障實例,從而實現故障隔離。同時,在故障修復后,又可以自動將流量重新分配到修復后的實例,實現快速的故障恢復。例如,在一個分布式的微服務系統中,如果一個服務節點出現硬件故障,服務網格可以迅速將原本發往該節點的流量分配到其他正常節點。
動態配置更新
控制平面可以動態地更新服務間通信的策略,無需重啟微服務。這使得微服務架構能夠快速適應業務需求的變化,如在流量高峰期調整負載均衡策略,或者在安全漏洞修復后更新安全策略。
五、服務網格的挑戰與應對
(一)性能開銷
代理的資源消耗
sidecar代理的運行會消耗一定的系統資源,如CPU、內存等。在大規模的微服務架構中,如果代理的資源消耗過大,可能會影響整個系統的性能。為了應對這一問題,可以對代理進行優化,例如采用高效的編程語言和算法,以及合理配置代理的資源限制。
網絡延遲增加
由于數據需要經過sidecar代理進行處理,可能會增加網絡延遲。可以通過優化代理的網絡處理邏輯,如采用異步處理、緩存機制等,來降低網絡延遲的影響。
(二)學習曲線與復雜度
技術的復雜性
服務網格涉及到多個概念和技術組件,對于開發人員和運維人員來說,存在一定的學習曲線。企業可以通過提供培訓課程、文檔資料等方式,幫助團隊成員掌握服務網格的相關知識和技能。
多組件集成的復雜性
在實際應用中,服務網格需要與現有的微服務架構、監控系統、安全系統等進行集成,這增加了系統的整體復雜度。在集成過程中,需要仔細規劃和設計,確保各個組件之間的兼容性和協同工作能力。
服務網格在微服務架構中的應用為解決服務間通信和管理等問題提供了強大的解決方案。它通過將通信管理從微服務中分離出來,提供了流量管理、服務發現、安全保障和可觀測性等多方面的功能,提升了微服務架構的整體性能、安全性和可維護性。盡管存在一些挑戰,但隨著技術的不斷發展和實踐經驗的積累,服務網格有望在未來的微服務架構中發揮更加重要的作用。
Service Mesh的主要實現原理
Service Mesh 是一種新型的用于處理服務與服務之間通信的技術,尤其適用于以云原生應用形式部署的服務,能夠保證服務與服務之間調用的可靠性。在實際部署時,Service Mesh 通常以輕量級的網絡代理方式與應用的代碼部署在一起,從而以應用無感知的方式實現服務治理。
1、與傳統的微服務架構的本質區別
Service Mesh 以輕量級的網絡代理方式與應用的代碼部署在一起,用于保證服務與服務之間調用的可靠性,這與傳統的微服務架構有著本質區別,具體體現在以下兩點。
- 跨語言服務調用的需要。大多數公司通常都存在多個業務團隊,每個團隊業務所采用的開發語言一般都不相同。比如移動服務端的業務主要采用的是 PHP 語言開發,API 平臺的業務主要采用的是 Java 語言開發,移動服務端調用 API 平臺使用的是 HTTP 請求。如果要進行服務化,改成 RPC 調用,就需要一種既支持 PHP 語言又支持 Java 語言的服務化框架。
- 云原生應用服務治理的需要。現在微服務越來越多開始容器化,并使用類似 Kubernetes 的容器平臺對服務進行管理,逐步向云原生應用的方向進化。而傳統的服務治理要求在業務代碼里集成服務框架的 SDK,這顯然與云原生應用的理念相悖,因此迫切需要一種對業務代碼無侵入的適合云原生應用的服務治理方式。
2、Service Mesh 實現原理
服務 A 要調用服務 B,經過 Linkerd 來代理轉發,服務 A 和服務 B 的業務代碼不需要關心服務框架功能的實現。為此 Linkerd 需要具備負載均衡、熔斷、超時重試、監控統計及服務路由等功能。這樣,對于跨語言服務調用來說,即使服務消費者和服務提供者采用的語言不同,也不需要集成各自語言的 SDK。
可見 Service Mesh 的實現原理有以下兩個。
- 一個是輕量級的網絡代理,也被稱為 SideCar,它的作用就是轉發服務之間的調用。
- 一個是基于 SideCar 的服務治理,也被稱為 Control Plane,它的作用是向 SideCar 發送各種指令,以完成各種服務治理功能。
3、SideCar
在 Service Mesh 架構中,服務框架的功能都集中在 SideCar 中實現,并在每一個服務消費者和服務提供者的本地都部署一個 SideCar,服務消費者和服務提供者只負責自己的業務實現,服務消費者向本地的 SideCar 發起請求,本地的 SideCar 根據請求的路徑向注冊中心查詢,得到服務提供者的可用節點列表后,再根據負載均衡策略選擇一個服務提供者節點,并向這個節點上的 SideCar 轉發請求,服務提供者節點上的 SideCar 完成流量統計、限流等功能后,再把請求轉發給本地部署的服務提供者進程,從而完成一次服務請求。
服務消費者節點上的 SideCar 稱為正向代理,服務提供者節點上的 SideCar 稱為反向代理,Service Mesh 架構的關鍵點就在于服務消費者發出的請求如何通過正向代理轉發,以及服務提供者收到的請求如何通過反向代理轉發。
4、Control Plane
SideCar 能實現服務之間的調用攔截功能,那么服務之間的所有流量都可以通過 SideCar 來轉發,這樣所有的 SideCar 就組成了一個服務網格,再通過一個統一的地方與各個 SideCar 交互,就能控制網格中流量的運轉了,這個統一的地方在 Service Mesh 中就被稱為 Control Plane。
Control Plane 包括以下功能:
- 服務發現
服務提供者會通過 SideCar 注冊到 Control Plane 的注冊中心,這樣服務消費者把請求發送給 SideCar 后,SideCar 就會查詢 Control Plane 的注冊中心來獲取服務提供者節點列表。
- 負載均衡
SideCar 從 Control Plane 獲取到服務提供者節點列表信息后,需要按照一定的負載均衡算法從可用的節點列表中選取一個節點發起調用,可以通過 Control Plane 動態修改 SideCar 中的負載均衡配置。
- 請求路由
SideCar 從 Control Plane 獲取的服務提供者節點列表,也可以通過 Control Plane 來動態改變,如需要進行 A/B 測試、灰度發布或者流量切換時,就可以動態地改變請求路由。
- 故障處理
服務之間的調用如果出現故障,就需要加以控制,常用的手段有超時重試、熔斷等,這些都可以在 SideCar 轉發請求時,通過 Control Plane 動態配置。
- 安全認證
可以通過 Control Plane 控制一個服務可以被誰訪問,以及訪問哪些信息。
- 監控上報
所有 SideCar 轉發的請求信息都會發送到 Control Plane,再由 Control Plane 發送給監控系統,如 Prometheus 等。
- 日志記錄
所有 SideCar 轉發的日志信息也會發送到 Control Plane,再由 Control Plane 發送給日志系統,如 Stackdriver 等。
- 配額控制
可以在 Control Plane 中為服務的每個調用方配置最大調用次數,在 SideCar 轉發請求給某個服務時,會審計調用是否超出服務對應的次數限制。
微服務實戰-Service Mesh與Istio
阿里云實戰課程:微服務實戰-Service Mesh與Istio_學習資源庫_阿里云培訓中心-阿里云
Service Mesh與微服務框架中的組件比較
在數字化轉型的旗幟下,IT界的一大變化是大型單體應用程序被分解為微服務架構,即小型、離散的功能單元,并且這些應用程序在容器中運行。包含所有服務代碼以及依賴項的軟件包被隔離起來,并且能輕松從一個服務器遷移到另一個。
像這樣的容器化架構很容易在云中擴展和運行,并且能夠快速迭代和推出每個微服務。然而,當應用程序越來越大并且在同一個服務上同時運行多個實例時,微服務之間通信將會變得愈發復雜。Service mesh的出現將解決這一問題,它是一個新興的架構形式,旨在以減少管理和編程開銷的形式來連接這些微服務。
什么是Service mesh?
關于Service mesh的定義,最為廣泛接受的觀點是:它是一種控制應用程序不同部分彼此共享數據的方式。這一描述包含了service mesh的方方面面。事實上,它聽起來更像是大多數開發人員從客戶端-服務器應用程序中熟悉的中間件。
Service mesh也有其獨特之處:它能夠適應分布式微服務環境的獨特性質。在搭建在微服務中的大規模應用程序中,有許多既定的服務實例,它們跨本地和云服務器運行。所有這些移動部件顯然使得各個微服務難以找到他們需要與之通信的其他服務。Service mesh可以在短時間內自動處理發現和連接服務,而無需開發人員以及各個微服務自行匹配。
我們可以將service mesh等同為軟件定義網絡(SDN)的OSI網絡模型第7層。正如SDN創建一個抽象層后網絡管理員不必處理物理網絡連接,service mesh將解耦在抽象架構中的與你交互的應用程序的底層基礎架構。
隨著開發人員開始努力解決真正龐大的分布式架構的問題,service mesh的概念適時地出現了。這一領域的第一個項目是Linkerd,它一開始是Twitter內部項目的一個分支。Istio是另一個十分流行的service mesh項目,它起源于Lyft,現在這一項目獲得了許多企業的支持。
Service mesh負載均衡
Service mesh其中一個關鍵功能是負載均衡。我們常常將負載均衡視為網絡功能——你想要防止服務器或網絡鏈接被流量淹沒,因此相應地你會路由你的數據包,而Service mesh在應用程序層面也在執行類似的事情。
本質上,Service mesh的工作之一是跟蹤分布在基礎設施上的各種微服務的哪些實例是“最健康的”。它可能對他們進行調查來查看它們如何工作的或跟蹤哪些實例對服務請求響應緩慢并將后續請求發送到其他實例。此外,service mesh也會為網絡路由做類似的工作,如果發現當消息需要很長時間才能送達,那么service mesh將會采用其他路由進行補償。這些減速可能是由于底層硬件出現問題,或者僅僅是由于服務因請求過載或處理能力不足導致的。但沒有關系,service mesh會找到另一個相同服務的實例,然后將其路由以替代響應緩慢的實例,高效利用了整個應用程序的資源。
Service mesh vs Kubernetes
如果你稍微熟悉基于容器的架構,你可能會想Kubernetes這個流行的開源容器編排平臺能否適合這種情況。畢竟,Kubernetes不就是管理著你的容器之間如何互相通信的嗎?你可將Kubernetes“服務”資源視為非常基礎的service mesh,因為它提供服務發現和請求的輪詢調度均衡。但是完整的service mesh則提供更豐富的功能,如管理安全策略和加密、“斷路”以暫停對緩慢響應的實例的請求以及如上所述的負載均衡等。
請記住,大多數service mesh確實需要像Kubernetes這樣的編排系統。Service mesh只是提供擴展功能,而非替代編排平臺。
Service mesh vs API 網關
每個微服務都會提供一個API,它會作為其他服務與其通信的手段。這引發了service mesh與其他更傳統的API管理形式(如API網關)之間的差異問題。API網關位于一組微服務和“外部”世界之間,它根據需要路由服務請求,以便請求者不需要知道它正在處理基于微服務的應用程序即可完成請求。而service mesh調解微服務應用程序內部的請求,各種組件完全了解其環境。
另一方面,service mesh用于優化集群內東西流量(server-server流量),API網關用于進出集群的南北流量(server-client流量)。但service mesh目前依舊處于早期階段還在不斷發展變化中。許多service mesh(包括Linkerd和Istio)現在已經可以提供南北功能。
Service mesh 架構
Service mesh這一概念其實出現的時間并不長,并且已經有相當數量的不同的方法來解決“service mesh”的問題,如管理微服務通信。目前,確定了三種service mesh創建的通信層可能存在的位置:
- 每個微服務導入的library
- 在特定節點提供服務給所有容器的節點agent
- 與應用程序容器一起運行的sidecar容器
基于sidecar的模式目前是service mesh最受歡迎的模式之一,以至于它在某種程度上已經成為了service mesh的代名詞。盡管這種說法并不嚴謹,但是sidecar已經引起了很大的關注,我們將在下文更詳細地研究這一架構。
Sidecar
Sidecar容器與你的應用程序容器一起運行意味著什么呢?在這類service mesh中每個微服務容器都有另一個proxy容器與之相對應。所有的服務間通信的需求都會被抽象出微服務之外并且放入sidecar。
這似乎很復雜,畢竟你有效地將應用程序中的容器數量增加了1倍。但你使用的這一種設計模式對于簡化分布式應用程序至關重要。通過將所有的網絡和通信代碼放到單獨的容器中,將其作為基礎架構的一部分,并使開發人員無需將其作為應用程序的一部分實現。
本質上,你所留下的是一個聚焦于業務邏輯的微服務。這個微服務不需要知道如何在其運行的環境中與所有其他服務進行通信。它只需要知道如何與sidecar進行通信即可,剩下的將由sidecar完成。
Service mesh明星項目:Linkerd、Envoy、Istio、Consul
那么說了這么多,什么是可用的service mesh呢?目前,這一領域還沒有出現完全現成的商業產品。大部分的service mesh只是開源項目,需要通過一定的操作步驟才能實現,現在比較知名的項目有:
- Linkerd:2016年發布,是這些項目中最老的。Linkerd是從Twitter開發的library中分離出來的。在這一領域另一位重量型選手,Conduit,已經進入了Linkerd項目并構成了Linkerd 2.0的基礎。
- Envoy:由Lyft創建,為了能夠提供完整的service mesh功能,Envoy占據“數據平面”的部分,與其進行匹配。
- Istio:由Lyft、IBM與google聯合開發,Istio可以在不修改微服務源代碼的情況下,輕松為其加上如負載均衡、身份驗證等功能,它可以通過控制Envoy等代理服務來控制所有的流量。此外,Istio提供容錯、金絲雀部署、A/B測試、監控等功能,并且支持自定義的組件和集成。 Rancher 2.3 Preview2版本上開始支持Istio,用戶可以直接在UI界面中啟動Istio并且可以為每個命名空間注入自動sidecar。Rancher內置了一個支持Kiali的儀表盤,簡化Istio的安裝和配置。這一切讓部署和管理Istio變得簡單而快速。
- HashiCorp Consul:與Consul 1.2一起推出了一項名為Connect的功能,為HashiCorp的分布式系統添加了服務加密和基于身份的授權,可用于服務發現和配置。