Dubbo Mesh 總體技術架構方案

語言: CN / TW / HK

作者: 江河清

Dubbo Mesh 作為 Dubbo 全面擁抱雲原生的又一個里程碑專案,將為 Dubbo 使用者提供平滑升級到 Service Mesh 架構的解決方案,同時繼續基於 Dubbo 強大可擴充套件性底座提供生產級服務治理、服務管控等能力。

本文將對 Dubbo Mesh 整體設計原則、部署架構與外掛管控機制的規劃做整體說明。

設計原則

Dubbo Mesh 以外掛化的方式接入各生態,除了部分維持基礎執行的架構外絕大部分的元件支援熱插拔,支援根據不同部署場景動態選擇部署方式。

外掛化能力的設計延續了 Dubbo 一貫的高可擴充套件性的特徵,基於這樣的一個基礎能力,開發者可以根據自己所需的真實部署場景進行定製,如接入內部的自建 DevOps 平臺等。通過外掛化的能力,也使得 Dubbo Mesh 在未來能更容易適配新的基礎元件;通過熱插拔的設計,絕大部分的新功能將能在生產環境平滑落地,很大程度上隔離由於中介軟體變更給業務帶來的變更協作影響。

1.png

部署架構

從架構與部署形態上來說 Dubbo Mesh 明確的區分為控制面與資料面。

其中控制面作為服務治理核心,具有抽象的、統一的模型,負責與底層基礎設施的對接,提供從啟動配置、服務發現、流量管理到認證鑑權等的統一治理入口。

資料面則專注在業務程式設計模型與通訊能力上,基於多種部署形態(SDK、Sidecar、Agent)接入服務治理能力,基於動態部署能力從業務程式碼中解耦出來。

從整體元件角色來說,Dubbo Mesh 中有兩種角色的元件:基礎元件、擴充套件性元件。

基礎元件由 Dubbo 原生提供,用於構建整個體系,如上圖中的 Admin 使用者管控元件、Dynamic Binary Push 動態分發元件(下文中會展開說明)、Proxy 資料代理元件等。

擴充套件性元件由 Dubbo 和其他生態共建提供,用於提供特定化能力,如上圖中功能的 Test 服務測試元件、Config 配置動態修改元件、Skywalking 全鏈路追蹤元件等。各擴充套件性元件均設計為可熱插,可以可選的動態開關部分能力。

資料流

上圖中除了部署架構的描述之外,還標識了在 Dubbo Mesh 這樣一個部署架構下的資料流向。

Dubbo Mesh 提供了兩種通訊模式,分別是 Proxy 模式與直連模式。在基礎元件中的 Proxy 提供到達資料面的通路,一個 Any 資料流,不繫結任何上層語義。擴充套件性元件可選通過 Proxy 進行互通,或者直接和資料面進行互通。

Proxy 模式不需要元件感知叢集的連線模式,適用於一些比較簡單、無獨立服務端的元件實現,基於 Dubbo 的能力能直接實現與資料面的通訊,降低管理連線的難度。直連模式用於整合一些複雜、有獨立服務端的元件,如全鏈路追蹤元件通常都需要獨立部署中心化的收集服務端,如果流量通過 Dubbo Proxy 進行轉發在一定程度上會導致部署成本的提高。

資料面架構

Dubbo Mesh 的資料面規劃分成 Java Proxyless 和 Sidecar 兩種模式。Java Proxyless 模式提供基於 Java ClassLoader 動態載入能力下的高效能部署方案;Sidecar 模式提供基於外接程序替換的跨語言、跨架構的通用部署方案。

Java Proxyless

2.png

Java Proxyless 模式是從常規 Dubbo Java 部署模式升級而來的,通過將 Dubbo 核心與實現分離的方式,基於 Java ClassLoader 的動態載入機制避免具體實現能力與業務程式碼進行耦合,提供中介軟體熱升級能力。

如上圖所示,Dubbo SDK 定義 Dubbo 擴充套件點,如 Router、Registry、LoadBalance 等,擴充套件點儘可能複用 Dubbo 已有的 SPI 機制。此外,Dubbo SDK 中整合一個統一的 DubboInitializer,執行時從控制面拉取所需執行時程式碼,組裝成為一個完整的 Dubbo SDK。

Sidecar

3.png

Sidecar 模式下 Dubbo 作為一個獨立程序執行,通過 UDS / TCP 等本地通訊方式或者請求攔截的方式管控流量。通過在 Sidecar 程序中進行資料加工、流量定製化路由等方式達成流量治理的目標。

Sidecar 模式也類似 Proxyless 模式提供擴充套件點,支援不同場景下自定義組裝實現、動態替換升級的能力。由於 Sidecar 是從流量層面直接進行治理,和業務程式碼本身不耦合,可以提供跨語言、跨架構的通用治理能力。

外掛推送模式

在前面的兩種資料面架構中都涉及到了擴充套件實現的動態下發的能力,本節中將對這部分能力做具體闡述說明。

Java Proxyless

4.png

Java Proxyless 模式下的擴充套件是通過 Java ClassLoader 進行動態類載入的,因此只需要拿到對應擴充套件的實現類既可實現載入。在 Dubbo Mesh 中通過統一的 Dynamic Binary Push 動態分發元件可以實現將每個外掛中自帶的對應類實現下發到資料面中進行載入。

Sidecar(Preview)

5.png

Sidecar 模式下,有多種方式能實現熱生效。這裡以替換程序的方式為例,在控制面中動態組裝 Sidecar 的程式碼並編譯,通過Dynamic Binary Push 動態分發元件動態下發 Sidecar 的二進位制包到資料面中的 Dubbo Agent,由 Dubbo Agent 負責拉起新的程序並切換流量到新的程序上。

更多關於 Dubbo Mesh 的動態可以關注 Apache Dubbo 社群官方公眾號(ApacheDubbo),及時獲取最新的訊息。

微信公眾號 | ApacheDubbo

釘釘群號 | 21976540

官網 | http://dubbo.apache.org 

點選“此處”,直達 Dubbo 官網!