天天看點

Apache Dubbo 多語言體系再添新員:首個 Rust 語言版本正式釋出

作者:CSDN

【CSDN 編者按】

據《中國開源發展研究分析 2022》Apache Dubbo在所有開源項目總排行榜中位列第 6,在國内微服務開源領域,有着舉足輕重的地位。

作者 | Apache Dubbo技術團隊 責編 | 張紅月

出品 | 官方投稿

近日,Apache Dubbo 釋出了其 Rust 語言實作的首個版本,進一步豐富其多語言體系,這是社群全面對齊 Dubbo3 架構的第三個語言實作。對 Rust 語言社群來說,Apache Dubbo 的加入也是其開源微服務開發架構生态非常重要的補充,Dubbo 也成為 Apache 社群中為數不多的提供 Rust 語言官方支援的項目。

Dubbo Rust 定位為 Dubbo 多語言體系的重要實作,提供高性能、易用、可擴充的 RPC 架構,同時通過接入 Dubbo Mesh 體系提供豐富的服務治理能力。本文主要為大家介紹 Dubbo Rust 項目基本情況,通過一個示例快速體驗 Rust 首個正式版本特性,并給出了 Dubbo Rust 社群的近期規劃,适合于關注或正在采用 Rust 語言的開發者與企業使用者閱讀。

Apache Dubbo 多語言體系再添新員:首個 Rust 語言版本正式釋出

雲原生時代的 Dubbo

自從 Apache Dubbo 在 2008 年由阿裡巴巴開源已來,Dubbo 一直是國内微服務領域最具影響力的開源項目之一,被無數網際網路、科技、制造企業選型作為内部微服務體系的基石,根據《中國開源發展研究分析 2022》Apache Dubbo在所有開源項目總排行榜中位列第 6。

Apache Dubbo 是一款支援多語言的、易用的微服務開發架構, 提供一些列元件為建構微服務提供高性能 RPC 通信、流量治理、動态配置、可觀測、認證鑒權等服務治理能力。

  • 高性能的基于 HTTP/2 的通用 RPC 協定及 Streaming 通信模型
  • 強大的流量治理能力,如位址發現、負載均衡、路由選址、動态配置等
  • 多語言 SDK 實作,涵蓋 Java、Golang、Rust、Node.js 等,更多語言實作将會陸續釋出
  • 豐富的生态及元件适配,如服務發現、鍊路追蹤、事務、可觀測性等業界主流産品均由官方支援接入
  • 雲原生友好,全面相容 Kubernetes 部署及 Service Mesh 架構,支援接入 Istio、Envoy、Proxyless 等。

除以上核心功能外,Dubbo 還具備以下優勢:

  • 開箱即用:1)易用性高,如 Java 版本的面向接口代理特性能實作本地透明調用、2)功能豐富,基于原生庫或輕量擴充即可實作絕大多數的微服務治理能力;
  • 面向超大規模微服務叢集設計:1)極緻性能,業界領先的高性能的 RPC 通信協定設計與實作、2)橫向可擴充,輕松支援百萬規模叢集執行個體的位址發現與流量治理;
  • 高度可擴充:1)調用過程中對流量及協定的攔截擴充,如 Filter、Router、Load Banlancing 等、2)微服務治理元件擴充,如 Registry、Config Center、Metadata Center 等;
  • 企業級微服務治理能力:1)國内公有雲廠商支援的事實标準服務架構、2)多年大型企業規模化實踐驗證。

在過去的一段時間裡,Dubbo 社群一直在積極的擁抱雲原生,包括在 Dubbo3(HTTP/2、Service Discovery 等)、Kubernetes、Proxyless Mesh 等方面做了大量的開發與建設工作,而這也取得了很好的回報,我們實作了 Dubbo3 取代全面 HSF 并在阿裡巴巴的全面推廣落地,同時也得到了大量社群頭部企業的跟進。

在接下來,Dubbo 社群在持續跟進以上特性的同時,會将相當一部分精力放在面向使用者側的易用性、穩定性等體驗提升上來,這包括官方網站、文檔、快速入門、示例實踐等的建設,同時,Dubbo 的多語言建設也将是非常重要的一環,因為我們認為讓使用者知道如何用好 Dubbo 将是社群的一項非常重要的職責。

Apache Dubbo 多語言體系再添新員:首個 Rust 語言版本正式釋出

Dubbo 多語言及 Rust 項目簡介

多語言體系建設是 Dubbo3 規劃中的重要一環,長期以來,Dubbo2 提供的語言實作僅有 Java、Golang 兩種,Dubbo2 的架構設計等都與 Java 語言有較強的綁定關系,如服務定義方式、通信協定、服務發現模型等。為了實作雲原生時代微服務多語言,徹底擺脫特定語言綁定的問題,Dubbo 社群陸續啟動了 Golang、Rust、Node.js、Python 等語言實作開發工作

  • Dubbo 官網:https://dubbo.apache.org/
  • Dubbo Java:https://github.com/apache/dubbo/
  • Dubbo Golang:https://github.com/apache/dubbo-go/
  • Dubbo Rust:https://github.com/apache/dubbo-rust/
  • Dubbo Node:https://github.com/apache/dubbo-js/

Dubbo Rust 項目的目标是對齊 Dubbo3 的所有核心功能設計,包括基于 HTTP/2 的高性能通信、使用者友好的微服務開發程式設計模式、通過接入 Dubbo Mesh 提供豐富的服務治理能力等,相比于其他語言實作,Dubbo Rust 将很好的利用 Rust 語言帶來的極緻性能、記憶體安全和零成本抽象的特點。

對于微服務架構,主流的程式設計語言都有對應的實作,而 Dubbo Rust 将很好的填補 Rust 領域的空白:

  • Golang:在微服務架構領域已經占據着很重要的地位;開源社群出現了dubbo-go、gRPC、go-micro、go-zero等多個微服務架構
  • Java:國内使用者量最大的程式設計語言,Spring Cloud、Dubbo 等優秀的微服務架構已經非常流行
  • C/C++:brpc、grpc 等微服務架構
  • Rust:目前沒有很完善的微服務架構

依托 Dubbo 龐大的使用者群,以及 Dubbo 體系下的 Mesh 服務治理整體方案規劃。Dubbo Rust 可以輕松地融入到現有的雲原生研發體系中,不會增加使用者的研發負擔。下圖是社群推出的 Dubbo Mesh 架構設計。

Apache Dubbo 多語言體系再添新員:首個 Rust 語言版本正式釋出

在上述架構下,整體分為控制面和資料面兩個部分,其中,

  • 控制面負責管理流量治理、位址發現、安全認證、可觀測性等服務治理相關的配置信管控工作,包括與K8S等底層技術設施的對接;
  • Dubbo Rust 作為資料面元件,負責接收來自控制面的配置;将配置應用到服務中;同時為服務提供基礎的RPC通信能力。

在架構設計方面,Dubbo Rust 将圍繞 Dubbo 核心設計以及 Rust 語言的特性進行設計,并将 Dubbo 架構的核心設計輸出為文檔,進而提升Dubbo架構的易用性。是以,Dubbo Rust 具有如下特點:易用性、高性能以及可擴充,同時面向雲原生提供豐富的服務治理能力。

首個 Rust 版本核心能力

Dubbo Rust 首個正式版本為 v0.2.0,v0.2.0 提供的能力包括:

  • 基于 HTTP/2 的 Triple 協定的基礎通信能力
  • 基于 IDL 的 RPC 定義支援,Protobuf 來生成代碼,同時支援 Serde 序列化
  • request-response、request streaming、response streaming、bi-streaming 通信模型支援
  • 設計了簡潔的、可擴充的架構,支援對 Listener、Connector、Filter、Protocol 以及 Invoker 元件進行擴充

Dubbo Rust v0.2.0 的核心元件及通信流程如下圖所示:

Apache Dubbo 多語言體系再添新員:首個 Rust 語言版本正式釋出

核心架構已經基本完成,接下來的版本将重點關注核心元件擴充以及服務治理相關元件的設計實作。

Apache Dubbo 多語言體系再添新員:首個 Rust 語言版本正式釋出

Dubbo Rust 開發初體驗

完整示例可檢視 【Dubbo官網】 -> 【Rust SDK 文檔】 https://dubbo.apache.org/zh/docs3-v2/rust-sdk/quick-start/

使用 Dubbo Rust 服務開發的基本步驟為

1. 環境準備

2. 使用 IDL 定義服務

3. 添加 Dubbo Rust 依賴到項目

4. 編譯 IDL

5. 基于 IDL 編譯生成的 stub 編寫 Server & Client 邏輯

6. 運作項目

1. 環境準備

1)安裝 Rust 開發環境

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh           

2) 安裝 protoc 工具

$ brew install protobuf              $ protoc --version # Ensure compiler version is 3+           

注:上述指令為 MacOS 環境下的,其他環境的安裝方案請參考官方文檔示例。

2. 使用 IDL 定義 Dubbo 服務

Greeter 服務定義如下,包含一個 Unary (request-response) 模型的 Dubbo 服務。

// ./proto/greeter.proto              syntax = "proto3";              option java_multiple_files = true;              package org.apache.dubbo.sample.tri;              // The request message containing the user's name.              message GreeterRequest {              string name = 1;              }              // The response message containing the greetings              message GreeterReply {              string message = 1;              }              service Greeter{              // unary              rpc greet(GreeterRequest) returns (GreeterReply);              }           

3. 增加 Dubbo Rust 依賴

# ./Cargo.toml              [package]              name = "example-greeter"              version = "0.2.0"              edition = "2021"              [dependencies]              dubbo = "0.2.0"              dubbo-config = "0.2.0"              [build-dependencies]              dubbo-build = "0.2.0"           

4. 編譯 IDL

在項目根目錄建立 (注意不是 src 目錄),建立 build.rs檔案并添加以下内容:

// ./build.rs              fn main {              dubbo_build::prost::configure              .compile(&["proto/greeter.proto"], &["proto/"])              .unwrap;              }           

這樣配置之後,編譯項目就可以生成 Dubbo Rust 的 Stub 代碼,路徑一般在./target/debug/build/example-greeter-<id>/out/org.apache.dubbo.sample.tri.rs。

5. 根據生成的 stub 編寫邏輯

5.1 編寫 Dubbo Server

// ./src/greeter/server.rs              use ...              #[tokio::main]              async fn main {              register_server(GreeterServerImpl {              name: "greeter".to_string,              });              // Dubbo::new.start.await;              Dubbo::new              .with_config({              let r = RootConfig::new;              match r.load {              Ok(config) => config,              Err(_err) => panic!("err: {:?}", _err), // response was droped              }              })              .start              .await;              }              #[allow(dead_code)]              #[derive(Default, Clone)]              struct GreeterServerImpl {              name: String,              }              #[async_trait]              impl Greeter for GreeterServerImpl {              async fn greet(              &self,              request: Request<GreeterRequest>,              ) -> Result<Response<GreeterReply>, dubbo::status::Status> {              println!("GreeterServer::greet {:?}", request.metadata);              Ok(Response::new(GreeterReply {              message: "hello, dubbo-rust".to_string,              }))              }              }           

5.2 配置 dubbo.yaml

dubbo.yaml 訓示server端的配置,包括暴露的服務清單、協定配置、監聽配置等。

# ./dubbo.yaml              name: dubbo              service:              org.apache.dubbo.sample.tri.Greeter:              version: 1.0.0              group: test              protocol: triple              registry: ''              serializer: json              protocol_configs:              triple:              ip: 0.0.0.0              port: '8888'              name: triple              protocols:              triple:              ip: 0.0.0.0              port: '8888'              name: triple           

5.3 編寫 Dubbo Client

// ./src/greeter/client.rs              use ...              #[tokio::main]              async fn main {              let mut cli = GreeterClient::new.with_uri("http://127.0.0.1:8888".to_string);              println!("# unary call");              let resp = cli              .greet(Request::new(GreeterRequest {              name: "message from client".to_string,              }))              .await;              let resp = match resp {              Ok(resp) => resp,              Err(err) => return println!("{:?}", err),              };              let (_parts, body) = resp.into_parts;              println!("Response: {:?}", body);              }           

6. 運作項目

6.1 編譯

執行 cargo build來編譯 server 和 client。

6.2 運作server

執行 ./target/debug/greeter-server 來運作 server,如上文 dubbo.yaml 所配置,server 會監聽 8888 端口,并以 triple 協定提供 RPC 服務。

$ ./target/debug/greeter-server              2022-11-06T14:53:33.201033Z INFO dubbo::framework: url: Some(Url { uri: "triple://0.0.0.0:8888/org.apache.dubbo.sample.tri.Greeter", protocol: "triple", location: "0.0.0.0:8888", ip: "0.0.0.0", port: "8888", service_key: ["org.apache.dubbo.sample.tri.Greeter"], params: {} })           

6.3 運作client

執行 ./target/debug/greeter-client 來運作 client ,調用triple://127.0.0.1:8888/org.apache.dubbo.sample.tri.Greeter 下的各種方法。

$ ./target/debug/greeter-client              # unary call              Response: GreeterReply { message: "hello, dubbo-rust" }           

這樣,一個簡單的 Dubbo Rust 示例就開發完成了。

Apache Dubbo 多語言體系再添新員:首個 Rust 語言版本正式釋出

Roadmap 及未來規劃

Dubbo Rust 緻力于成為 Rust 語言社群最受歡迎的微服務開發架構之一,将 Dubbo 在微服務架構領域的積累帶給開發者,填補 Rust 社群微服務開發架構的空缺。為了達成這個目标,Dubbo Rust Roadmap 規劃總體上分為三個階段:

  • 首先,提供作為 RPC 架構的基礎能力,此階段重點完成的包括基于 HTTP/2 的 RPC 通信、基于 IDL 的 RPC 定義、其他必要的 RPC 核心元件等
  • 其次是完善 Dubbo Rust 作為微服務架構的進階功能,此階段包括微服務定義、配置、功能設計等,如服務逾時、異步調用、上下文傳遞、開發者工效學提升(developer ergonomics)、FFI支援等,具體可參見 Dubbo Java 的進階特性。
  • 第三階段重點是引入豐富的服務治理能力支援,如流量治理、限流降級、可觀測性等,這一目标将主要通過融入 Dubbo Mesh 體系,即适配 Dubbo Mesh 控制面實作。

其中,第一階段的工作已經基本完成,大家可通過上文的 Quick Start 進行深入體驗,第二、第三階段的工作已經在社群全面開展,歡迎感興趣的社群開發者參與進來。

下圖是側重從第一階段(RPC架構)、第二階段(微服務開發架構)的視角對目前 Dubbo Rust 功能完備性的評估和任務拆解。

Apache Dubbo 多語言體系再添新員:首個 Rust 語言版本正式釋出

上圖中都是 Dubbo Rust 核心設計的重要元件,保證 Dubbo Rust 具備微服務架構中完整的 RPC 通信能力以及服務治理能力。

  • Protocol、Filter、Listener、Connector 等元件都是 RPC 通信核心能力
  • 服務注冊發現、負載均衡、Cluster、Metadata 為後續服務治理能力做鋪墊

除了上圖列出的子產品以外,還有一些非功能需求也需要支援,例如:

  • Dubbo 多語言架構之間互相通信測試
  • 性能驗證與持續的 benchmark 機制
  • 整體架構的持續優化,如核心配置簡化以及相應的文檔完善

和 Rust 語言一經釋出就受到了開發者的熱捧一樣,Dubbo Rust 目前也是一個非常有活力、非常前沿的社群;另一方面,依賴 Apache Dubbo 社群背後龐大的開發者群體和企業使用者,Dubbo Rust 有着非常深厚的使用者基礎和發展潛力。Dubbo Rust 的快速發展期待社群貢獻者的加入。

參與 Dubbo Rust 社群可以收獲

  • 見證 Rust 語言社群微服務開源項目的發展
  • 在大型項目中實際使用 Rust 語言,加深對 Rust 語言的了解
  • 獲得提名為 Apache Dubbo Committer、PMC 的機會
  • 與 Dubbo 社群及知名企業技術專家面對面的交流機會

歡迎通過以下方式參與 Dubbo Rust 社群:

直接到 GitHub 送出 Issue 或貢獻代碼 https://github.com/apache/dubbo-rust

Apache Dubbo 多語言體系再添新員:首個 Rust 語言版本正式釋出
Apache Dubbo 多語言體系再添新員:首個 Rust 語言版本正式釋出