【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 語言的開發者與企業使用者閱讀。

雲原生時代的 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 將是社區的一項非常重要的職責。

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 架構設計。

在上述架構下,整體分為控制面和資料面兩個部分,其中,
控制面負責管理流量治理、地址發現、安全認證、可觀測性等服務治理相關的配置信管控工作,包括與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 的核心元件及通訊流程如下圖所示:

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

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-/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,
) -> Result<Response, 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 示例就開發完成了。

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 功能完備性的評估和任務拆解。

上圖中都是 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 社區:
搜尋並關注 Apache Dubbo 了解社區最新動態
直接到 GitHub 提交 Issue 或貢獻程式碼 https://github.com/apache/dubbo-rust
☞AI語音程式設計來了!GitHub 勢要顛覆程式設計師開發
☞NVIDIA 安全團隊:如果我們停止使用 C 會怎樣?
☞涉及上萬人,人均71萬補償,祖克柏承認因決策失誤致Meta首次大規模裁員
