Dubbo Rust 近期發布了首個正式版本,Dubbo Rust 目標是對齊 Dubbo 3 的所有核心功能設計,包括基于 HTTP/2 的高性能通信、用戶友好的微服務開發編程模式、通過接入Dubbo Mesh提供豐富的服務治理能力等。相比于其他語言實現,Dubbo Rust 將很好的利用 Rust 語言極致性能、安全和指令級掌控能力的特點。
1?
前置條件
安裝 Rust 開發環境
安裝 protoc 工具
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.1.0" edition = "2021" [[bin]] name = "greeter-server" path = "src/greeter/server.rs" [[bin]] name = "greeter-client" path = "src/greeter/client.rs" [dependencies] http = "0.2" http-body = "0.4.4" futures-util = {version = "0.3", default-features = false} tokio = { version = "1.0", features = [ "rt-multi-thread", "time", "fs", "macros", "net", "signal"] } prost-derive = {version = "0.10", optional = true} prost = "0.10.4" async-trait = "0.1.56" tokio-stream = "0.1" dubbo = "0.2.0" dubbo-config = "0.2.0" [build-dependencies] dubbo-build = "0.2.0"
4?
配置 Dubbo - Build 編譯 IDL
在項目根目錄創建(注意不是 src 目錄),創建 build.rs 文件并添加以下內容:
// ./build.rs
fn main() {
dubbo_build::configure()
.compile(&["proto/greeter.proto"], &["proto/"])
.unwrap();
}
這樣配置之后,編譯項目就可以生成 Dubbo Stub 相關代碼。
路徑一般在:
./target/debug/build/example-greeter/out/org.apache.dubbo.sample.tri.rs
5?
編寫 Dubbo 業務代碼
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]
#[async_trait]
impl Greeter for GreeterServerImpl {
async fn greet(
&self,
request: Request,
) -> Result, dubbo::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-09-28T2328.104577Z INFO dubbo: 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
Response: GreeterReply { message: "hello, dubbo-rust" }
審核編輯:劉清
-
HTTP
+關注
關注
0文章
537瀏覽量
35350 -
IDL
+關注
關注
0文章
19瀏覽量
7802 -
rust語言
+關注
關注
0文章
57瀏覽量
3278
原文標題:用 Rust 語言開發微服務:Dubbo Rust 首個正式版本初體驗
文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
基于Rust語言Hash特征的基礎用法和進階用法
Rust語言如何與 InfluxDB 集成
如何用 rust 語言開發 stm32
微服務網關gateway的相關資料推薦
微服務優勢_微服務架構的好處與不足
微軟開發基于Rust的新編程語言,將很快開源
微服務為什么要用到API網關?
適合嵌入式設備開發的編程語言—Rust語言
基于Rust開發的編程語言
springcloud微服務架構
如何構建彈性、高可用的微服務?
用Rust語言開發微服務
評論