無代理服務網格

1. 什麼是無代理服務網格?

1.1 服務網格簡析

Istio 是目前最流行的開源服務網格,它由控制平面和數據平面組成,其架構如下圖所示。圖片取自 Istio 官網

After using Istio

圖中下半部分的控制平面負責配置、服務信息和證書等資源的下發,上半部分的數據平面則關注服務間的通信流量;傳統的服務網格通過代理攔截所有業務網絡流量,代理需要感知控制平面下發的配置資源,從而按需控制網絡流量走向。

在 Istiod 環境中,其控制平面是一個名為 istiod 的進程,網絡代理為 envoy。istiod 通過監聽 K8S 的 Service、Endpoint 等資源獲取服務信息,並通過 XDS 協議將這些資源下發給數據平面上的網絡代理。Envoy 是一個獨立進程,它以 sidecar(邊車)的形式與業務應用 Pod 一起運行,它與應用進程共享同一個主機網絡,通過修改路由表的方式劫持業務應用的網絡流量。

服務網格(Service Mesh)可以解決微服務場景下的諸多問題。隨著叢集規模的擴大和業務複雜性的增長,基於原生 k8s 的容器編排方案將難以應付,開發人員不得不面臨巨大的服務治理挑戰。服務網格很好地解決了這一問題,它將服務治理的需求封裝在控制平面和代理中,業務開發者只需關注業務邏輯。應用部署後,運維人員只需修改配置即可實現故障恢復、負載均衡、灰度發布等功能,極大地提升了研發迭代的效率。

Istio 的 Sidecar 通過容器注入的方式伴隨業務應用程序進程的整個生命週期,對業務應用程序無侵入,這解決了業務應用遷移、多語言、基礎設施耦合等問題。但這也帶來了資源消耗高、請求延遲增加的問題。

服務網格為服務治理提供了一個很好的思路,將基礎設施從業務邏輯中解耦,讓應用開發者只關注業務本身。另一方面,由於 Sidecar 的缺點,我們可以考慮使用 SDK 來代替 Sidecar 支撐數據平面。

1.2 無代理服務網格(Proxyless Service-Mesh)

無代理服務網格是近年來提出的一個新概念,istio、gRPC、brpc 等開源社區都在朝這個方向進行探索和實踐。無代理服務網格框架以 SDK 的形式被業務應用程序引入,負責服務之間的通信和治理。來自控制平面的配置直接下發到服務框架,由服務框架代為執行上述 Sidecar 的功能。

img

服務框架(SDK)的主要能力可以概括為以下三點

  1. 連接到控制平面,監聽配置資源。
  2. 對接應用程序,為開發者提供便捷的接口。
  3. 連接到網路,並根據資源變化響應流量規則。

1.3 無代理的優缺點

優點

  • 性能:無代理模式下的網路調用是點對點的直接通信,網路延遲將遠小於代理模式。
  • 穩定性:無代理模式是單進程,拓撲結構簡單,易於調試,穩定性高。
  • 框架整合:市面上已經有很多 SDK 模式的服務框架,切換到 Mesh 後具備框架复用的能力
  • 資源消耗:無需 Sidecar,資源消耗低

缺點

  • 語言綁定:需要開發多種語言的 SDK
  • 可移植性低:無法像切換 Sidecar 形式那樣無侵入地升級基礎設施。

一般來說,Proxyless 架構由於其高性能和高穩定性,更適合用於生產環境。

2. Dubbo-go 與無代理服務網格

2.1 Dubbo-go 在無代理服務網格場景下的設計

服務註冊與發現

Dubbo-go 本身具有可擴展的服務註冊與發現能力,我們針對服務網格場景對註冊中心的實現進行了適配。開發者可以將 dubbo-go 應用信息註冊在 istiod 控制平面上。客戶端應用可以查詢已註冊的接口數據,完成服務發現流程。

img

  1. 開發者使用 dubbogo-cli 工具創建應用模板並發布 Deployment / Service 到叢集中。
  2. 伺服器端拉取全量的 CDS 和 EDS,比對本地 IP,獲取當前應用的主機名。並將此應用程序接口名到主機名的所有映射關係註冊到 Istiod 上。
  3. 客戶端會從 istiod 拉取完整介面名稱到主機名稱的映射,並將其快取在本地。當需要發起呼叫時,會查詢本地快取,將介面名稱轉換為主機名稱,然後透過 CDS 和 EDS 拉取到對應當前叢集的完整端點。
  4. 所有端點都會經過 Dubbo-go 內建的 Mesh Router 進行過濾,篩選出最終的端點子集,並根據配置的負載均衡策略發起請求。

開發者在整個過程中只需要關注介面,完全不需要關心主機名稱和端口資訊。即服務端開發者只需要實現 pb 介面並使用框架暴露即可;客戶端開發者只需要引入 pb 介面並直接發起呼叫即可。

流量管理

Dubbo-go 具有路由能力,透過 xds 協議客戶端訂閱來自 istiod 的路由配置,並即時更新到本地路由規則,從而實現服務治理。Dubbo-go 兼容 istio 生態的流量治理規則,透過配置 Virtual Service 和 Destination Rule,可以將標記的流量路由到指定的子集,還可以用於灰度發布、流量切換等場景,更加深入地使用。

雲原生支架

dubbogo-cli 是 Apache/dubbo-go 生態的一個子專案,它為開發者提供了應用程式範本創建、工具安裝、介面調試等便捷功能,提高用戶研發效率。

詳情請參考 [dubbogo-cli 工具]

3. Dubbo-go-Mesh 的優勢

3.1 介面級服務發現

前文介紹了透過介面級服務註冊進行發現的優勢,即開發者無需關心下游主機名和端口號,只需要引入介面存根,或者實現介面,並透過框架啟動即可。

3.2 高效能

我們在 k8s 叢集中部署了 istio 環境,分別測試了 sidecar 模式的 gRPC 服務呼叫和 Proxyless 模式的 dubbo-go 應用程式服務呼叫。發現 Proxyless 模式在請求耗時方面比 sidecar 模式低一個數量級,即效能提升約十倍。

3.3 跨生態

Dubbo-go 是一個跨越多個生態的服務框架。

  • 網格生態

    開發者可以在使用 Dubbo-go 進行應用程式開發的同時,使用 istio 生態提供的強大能力。

  • gRPC 生態

    • Dubbo-go 支援與 gRPC 服務的互操作性,HTTP2 協議棧。
    • Dubbo-go 預設使用 pb 序列化,高效能。
  • Dubbo 生態

    • 多語言優勢,可以實現 go-java 應用程式互通。
    • 兼容 pixiu 閘道器,方便服務暴露和協議轉換。
    • 使用 Dubbo-go 生態元件。

上次修改時間:2023 年 2 月 23 日:SEO / 圖片替代文字更新 (35090e3f9b4)