什麼是Service Mesh(服務網格)
Service Mesh 又譯作 “服務網格”,作為服務間通信的基礎設施層。Buoyant 公司的 CEO Willian Morgan 在他的這篇文章 WHAT’S A Service Mesh? AND WHY DO I NEED ONE? 中解釋了什麼是 Service Mesh,為什麼雲原生應用需要 Service Mesh。
下面是 Willian Morgan 對 Service Mesh 的解釋。
A Service Mesh is a dedicated infrastructure layer for handling service-to-service communication. It’s responsible for the reliable delivery of requests through the complex topology of services that comprise a modern, cloud native application. In practice, the Service Mesh is typically implemented as an array of lightweight network proxies that are deployed alongside application code, without the application needing to be aware.
翻譯成中文是:
服務網格(Service Mesh)是緻力于解決服務間通訊的基礎設施層。它負責在現代雲原生應用程式的複雜服務拓撲來可靠地傳遞請求。實際上,Service Mesh 通常是通過一組輕量級網絡代理(Sidecar proxy),與應用程式代碼部署在一起來實作,而無需感覺應用程式本身。
Service Mesh的特點
Service Mesh 有如下幾個特點:
- 應用程式間通訊的中間層
- 輕量級網絡代理
- 應用程式無感覺
- 解耦應用程式的重試/逾時、監控、追蹤和服務發現
目前兩款流行的 Service Mesh 開源軟體 Istio 和 Linkerd 都可以直接在 kubernetes 中內建,其中 Linkerd 已經成為 CNCF 成員。
了解 Service Mesh
如果用一句話來解釋什麼是 Service Mesh,可以将它比作是應用程式或者說微服務間的 TCP/IP,負責服務之間的網絡調用、限流、熔斷和監控。對于編寫應用程式來說一般無須關心 TCP/IP 這一層(比如通過 HTTP 協定的 RESTful 應用),同樣使用 Service Mesh 也就無須關心服務之間的那些原來是通過應用程式或者其他架構實作的事情,比如 Spring Cloud、OSS,現在隻要交給 Service Mesh 就可以了。
Phil Calçado 在他的這篇部落格 Pattern: Service Mesh 中詳細解釋了 Service Mesh 的來龍去脈:
- 從最原始的主機之間直接使用網線相連
- 網絡層的出現
- 內建到應用程式内部的控制流
- 分解到應用程式外部的控制流
- 應用程式的中內建服務發現和斷路器
- 出現了專門用于服務發現和斷路器的軟體包/庫,如 Twitter 的 Finagle 和 Facebook 的 Proxygen,這時候還是內建在應用程式内部
- 出現了專門用于服務發現和斷路器的開源軟體,如 Netflix OSS、Airbnb 的 synapse 和 nerve
- 最後作為微服務的中間層 Service Mesh 出現
Service Mesh 的架構如下圖所示:

圖檔來自:Pattern: Service Mesh
Service Mesh 作為 sidecar 運作,對應用程式來說是透明,所有應用程式間的流量都會通過它,是以對應用程式流量的控制都可以在 serivce mesh 中實作。
Service Mesh如何工作?
下面以 Linkerd 為例講解 Service Mesh 如何工作,Istio 作為 Service Mesh 的另一種實作原理與 linkerd 基本類似,後續文章将會詳解 Istio 和 Linkerd 如何在 kubernetes 中工作。
- Linkerd 将服務請求路由到目的位址,根據中的參數判斷是到生産環境、測試環境還是 staging 環境中的服務(服務可能同時部署在這三個環境中),是路由到本地環境還是公有雲環境?所有的這些路由資訊可以動态配置,可以是全局配置也可以為某些服務單獨配置。
- 當 Linkerd 确認了目的位址後,将流量發送到相應服務發現端點,在 kubernetes 中是 service,然後 service 會将服務轉發給後端的執行個體。
- Linkerd 根據它觀測到最近請求的延遲時間,選擇出所有應用程式的執行個體中響應最快的執行個體。
- Linkerd 将請求發送給該執行個體,同時記錄響應類型和延遲資料。
- 如果該執行個體挂了、不響應了或者程序不工作了,Linkerd 将把請求發送到其他執行個體上重試。
- 如果該執行個體持續傳回 error,Linkerd 會将該執行個體從負載均衡池中移除,稍後再周期性得重試。
- 如果請求的截止時間已過,Linkerd 主動失敗該請求,而不是再次嘗試添加負載。
- Linkerd 以 metric 和分布式追蹤的形式捕獲上述行為的各個方面,這些追蹤資訊将發送到集中 metric 系統。
為何使用 Service Mesh?
Service Mesh 并沒有給我們帶來新功能,它是用于解決其他工具已經解決過的問題,隻不過這次是在 Cloud Native 的 kubernetes 環境下的實作。
在傳統的 MVC 三層 Web 應用程式架構下,服務之間的通訊并不複雜,在應用程式内部自己管理即可,但是在現今的複雜的大型網站情況下,單體應用被分解為衆多的微服務,服務之間的依賴和通訊十分複雜,出現了 twitter 開發的 Finagle、Netflix 開發的 Hystrix 和 Google 的 Stubby 這樣的 “胖用戶端” 庫,這些就是早期的 Service Mesh,但是它們都近适用于特定的環境和特定的開發語言,并不能作為平台級的 Service Mesh 支援。
在 Cloud Native 架構下,容器的使用給予了異構應用程式的更多可行性,kubernetes 增強的應用的橫向擴容能力,使用者可以快速的編排出複雜環境、複雜依賴關系的應用程式,同時開發者又無須過分關心應用程式的監控、擴充性、服務發現和分布式追蹤這些繁瑣的事情而專注于程式開發,賦予開發者更多的創造性。