Service Mesh服務網格

Service Mesh 又譯作 “服務網格”,作爲服務間通信的基礎設施層。Buoyant 公司的 CEO Willian Morgan 在他的這篇文章 WHAT’S A Service Mesh? AND WHY DO I NEED ONE? 中解釋了什麼是 Service Mesh,爲什麼雲原生應用需要 Service Mesh。

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 就可以了。

下面是 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 的來龍去脈:

  1. 從最原始的主機之間直接使用網線相連
  2. 網絡層的出現
  3. 集成到應用程序內部的控制流
  4. 分解到應用程序外部的控制流
  5. 應用程序的中集成服務發現和斷路器
  6. 出現了專門用於服務發現和斷路器的軟件包/庫,如 Twitter 的 Finagle 和 Facebook 的 Proxygen,這時候還是集成在應用程序內部
  7. 出現了專門用於服務發現和斷路器的開源軟件,如 Netflix OSS、Airbnb 的 synapse 和 nerve
  8. 最後作爲微服務的中間層 Service Mesh 出現

Service Mesh 的架構如下圖所示:

圖片來自:Pattern: Service Mesh

Service Mesh 作爲 sidecar 運行,對應用程序來說是透明,所有應用程序間的流量都會通過它,所以對應用程序流量的控制都可以在 serivce mesh 中實現。

Service Mesh如何工作?

下面以 Linkerd 爲例講解 Service Mesh 如何工作,Istio 作爲 Service Mesh 的另一種實現原理與 linkerd 基本類似,後續文章將會詳解 Istio 和 Linkerd 如何在 kubernetes 中工作。

  1. Linkerd 將服務請求路由到目的地址,根據中的參數判斷是到生產環境、測試環境還是 staging 環境中的服務(服務可能同時部署在這三個環境中),是路由到本地環境還是公有云環境?所有的這些路由信息可以動態配置,可以是全局配置也可以爲某些服務單獨配置。
  2. 當 Linkerd 確認了目的地址後,將流量發送到相應服務發現端點,在 kubernetes 中是 service,然後 service 會將服務轉發給後端的實例。
  3. Linkerd 根據它觀測到最近請求的延遲時間,選擇出所有應用程序的實例中響應最快的實例。
  4. Linkerd 將請求發送給該實例,同時記錄響應類型和延遲數據。
  5. 如果該實例掛了、不響應了或者進程不工作了,Linkerd 將把請求發送到其他實例上重試。
  6. 如果該實例持續返回 error,Linkerd 會將該實例從負載均衡池中移除,稍後再週期性得重試。
  7. 如果請求的截止時間已過,Linkerd 主動失敗該請求,而不是再次嘗試添加負載。
  8. 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 增強的應用的橫向擴容能力,用戶可以快速的編排出複雜環境、複雜依賴關係的應用程序,同時開發者又無須過分關心應用程序的監控、擴展性、服務發現和分佈式追蹤這些繁瑣的事情而專注於程序開發,賦予開發者更多的創造性。

代表產品:Istio Handbook - Istio服務網格實踐指南

關於 Service Mesh 的更多資訊請訪問 ServiceMesher 服務網格社區網站 或關注 ServiceMesher 的微信公衆號。

參考

轉載來源:https://jimmysong.io/posts/what-is-a-service-mesh/

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章