| <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Apache Dubbo – Rust</title><link>https://dubbo.apache.org/zh-cn/blog/rust/</link><description>Recent content in Rust on Apache Dubbo</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><atom:link href="https://dubbo.apache.org/zh-cn/blog/rust/index.xml" rel="self" type="application/rss+xml"/><item><title>Blog: Apache Dubbo 多语言体系再添新员:首个 Rust 语言版本正式发布</title><link>https://dubbo.apache.org/zh-cn/blog/2022/10/23/apache-dubbo-%E5%A4%9A%E8%AF%AD%E8%A8%80%E4%BD%93%E7%B3%BB%E5%86%8D%E6%B7%BB%E6%96%B0%E5%91%98%E9%A6%96%E4%B8%AA-rust-%E8%AF%AD%E8%A8%80%E7%89%88%E6%9C%AC%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83/</link><pubDate>Sun, 23 Oct 2022 00:00:00 +0000</pubDate><guid>https://dubbo.apache.org/zh-cn/blog/2022/10/23/apache-dubbo-%E5%A4%9A%E8%AF%AD%E8%A8%80%E4%BD%93%E7%B3%BB%E5%86%8D%E6%B7%BB%E6%96%B0%E5%91%98%E9%A6%96%E4%B8%AA-rust-%E8%AF%AD%E8%A8%80%E7%89%88%E6%9C%AC%E6%AD%A3%E5%BC%8F%E5%8F%91%E5%B8%83/</guid><description> |
| <p>Dubbo Rust 定位为 Dubbo 多语言体系的重要实现,提供高性能、易用、可扩展的 RPC 框架,同时通过接入 Dubbo Mesh 体系提供丰富的服务治理能力。本文主要为大家介绍 Dubbo Rust 项目基本情况,通过一个示例快速体验 Rust 首个正式版本特性,并给出了 Dubbo Rust 社区的近期规划,适合于关注或正在采用 Rust 语言的开发者与企业用户阅读。</p> |
| <h2 id="1-dubbo-rust-简介">1 Dubbo Rust 简介</h2> |
| <p>Dubbo 作为 Apache 基金会最活跃的明星项目之一,同时也是国内最受欢迎的开源微服务框架,在易用性、高性能通信、服务治理等方面有着非常大的优势,通过 Dubbo3、Dubbo Mesh 等提供了云原生友好的开发与部署模式。与此同时,Dubbo 的多语言体系也得到了快速发展,长期以来提供的有 Java、Golang 两种语言实现,Rust、Node、Python、C++ 等语言实现的支持也已在社区正式启动。</p> |
| <ul> |
| <li>Dubbo 官网 <a href="https://dubbo.apache.org/">https://dubbo.apache.org/</a></li> |
| <li>Dubbo Java <a href="https://github.com/apache/dubbo/">https://github.com/apache/dubbo/</a></li> |
| <li>Dubbo Golang <a href="https://github.com/apache/dubbo-go/">https://github.com/apache/dubbo-go/</a></li> |
| <li><strong>Dubbo Rust <a href="https://github.com/apache/dubbo-rust/">https://github.com/apache/dubbo-rust/</a></strong></li> |
| </ul> |
| <p>Dubbo Rust 目标是对齐 Dubbo3 的所有核心功能设计,包括基于 HTTP/2 的高性能通信、用户友好的微服务开发编程模式、通过接入DubboMesh提供丰富的服务治理能力等,相比于其他语言实现,Dubbo Rust 将很好的利用 Rust 语言极致性能、安全和指令级掌控能力的特点。 |
| 对于微服务框架,主流的编程语言都有对应的实现,而 Dubbo Rust 将很好的填补 Rust 领域的空白:</p> |
| <ul> |
| <li>Golang:在微服务框架领域已经占据着很重要的地位;开源社区出现了dubbo-go、gRPC、go-micro、go-zero等多个微服务框架</li> |
| <li>Java:国内用户量最大的编程语言,Spring Cloud、Dubbo等优秀的微服务框架已经非常流行</li> |
| <li>C/C++:brpc、grpc 等微服务框架</li> |
| <li>Rust:目前没有很完善的微服务框架</li> |
| </ul> |
| <p>依托 Dubbo 庞大的用户群,以及 Dubbo 体系下的 Mesh 服务治理整体方案规划。Dubbo Rust 可以轻松地融入到现有的云原生研发体系中,不会增加使用者的研发负担。下图是社区推出的 Dubbo Mesh 架构设计。</p> |
| <p><img src="https://dubbo.apache.org/imgs/rust/dubbo-rust-mesh.png" alt="dubbo-rust"></p> |
| <p>在上述架构下,整体分为控制面和数据面两个部分,其中,</p> |
| <ul> |
| <li>控制面负责管理流量治理、地址发现、安全认证、可观测性等服务治理相关的配置信管控工作,包括与K8S等底层技术设施的对接;</li> |
| <li>Dubbo Rust 作为数据面组件,负责接收来自控制面的配置;将配置应用到服务中;同时为服务提供基础的RPC通信能力。</li> |
| </ul> |
| <p>在架构设计方面,Dubbo Rust 将围绕 Dubbo 核心设计以及 Rust 语言的特性进行设计,并将 Dubbo 框架的核心设计输出为文档,从而提升Dubbo框架的易用性。因此,Dubbo Rust 具有如下特点:易用性、高性能以及可扩展,同时面向云原生提供丰富的服务治理能力。</p> |
| <h2 id="2-快速体验-dubbo-rust">2 快速体验 Dubbo Rust</h2> |
| <h3 id="21-首个版本核心能力">2.1 首个版本核心能力</h3> |
| <p><strong>Dubbo Rust 首个正式版本为 v0.2.0</strong>,v0.2.0 提供的能力包括</p> |
| <ul> |
| <li>基于 HTTP/2 的 Triple 协议的基础通信能力</li> |
| <li>基于 IDL 的 RPC 定义支持,Protobuf 来生成代码,同时支持 Serde 序列化</li> |
| <li>request-response、request/response streaming、bi-streaming 通信模型支持</li> |
| <li>设计了简洁的、可扩展的架构,支持对 Listener、Connector、Filter、Protocol以及Invoker组件进行扩展</li> |
| </ul> |
| <p>Dubbo Rust v0.2.0 的核心组件及通信流程如下图所示</p> |
| <p><img src="https://dubbo.apache.org/imgs/rust/dubbo-rust-module.png" alt="dubbo-rust"></p> |
| <p>核心架构已经基本完成,接下来的版本将重点关注核心组件的扩展以及服务治理相关组件的设计实现。</p> |
| <h3 id="22-quick-start">2.2 Quick Start</h3> |
| <blockquote> |
| <p>完整示例可查看 【Dubbo官网】 -&gt; 【Rust SDK 文档】。 |
| <a href="https://dubbo.apache.org/zh-cn/overview/mannual/rust-sdk/quick-start/">https://dubbo.apache.org/zh-cn/overview/mannual/rust-sdk/quick-start/</a></p> |
| </blockquote> |
| <p>使用 Dubbo Rust 服务开发的基本步骤为</p> |
| <ol> |
| <li> |
| <p>使用 IDL 定义服务</p> |
| </li> |
| <li> |
| <p>添加 Dubbo Rust 依赖到项目</p> |
| </li> |
| <li> |
| <p>编译 IDL</p> |
| </li> |
| <li> |
| <p>基于 IDL 编译生成的 stub 编写 Server &amp; Client 逻辑</p> |
| </li> |
| <li> |
| <p>运行项目</p> |
| </li> |
| <li> |
| <p>使用 IDL 定义 Dubb 服务</p> |
| </li> |
| </ol> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-protobuf" data-lang="protobuf"><span style="display:flex;"><span>```protobuf |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// ./proto/greeter.proto |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span>syntax <span style="color:#719e07">=</span> <span style="color:#2aa198">&#34;proto3&#34;</span>; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">option</span> java_multiple_files <span style="color:#719e07">=</span> <span style="color:#cb4b16">true</span>; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">package</span> org<span style="color:#719e07">.</span>apache.dubbo.sample.tri; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// The request message containing the user&#39;s name. |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#268bd2">message</span> <span style="color:#268bd2">GreeterRequest</span> { |
| </span></span><span style="display:flex;"><span><span style="color:#dc322f">string</span> name <span style="color:#719e07">=</span> <span style="color:#2aa198">1</span>; |
| </span></span><span style="display:flex;"><span>} |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// The response message containing the greetings |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#268bd2">message</span> <span style="color:#268bd2">GreeterReply</span> { |
| </span></span><span style="display:flex;"><span><span style="color:#dc322f">string</span> <span style="color:#268bd2">message</span> <span style="color:#719e07">=</span> <span style="color:#2aa198">1</span>; |
| </span></span><span style="display:flex;"><span>} |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span><span style="color:#268bd2">service</span> Greeter{ |
| </span></span><span style="display:flex;"><span><span style="color:#586e75">// unary |
| </span></span></span><span style="display:flex;"><span><span style="color:#586e75"></span><span style="color:#719e07">rpc</span> greet(GreeterRequest) <span style="color:#719e07">returns</span> (GreeterReply); |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>� |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>2. 增加 Dubbo Rust 依赖 |
| </span></span><span style="display:flex;"><span>```toml |
| </span></span><span style="display:flex;"><span>```toml |
| </span></span><span style="display:flex;"><span># ./Cargo.toml |
| </span></span><span style="display:flex;"><span>[package] |
| </span></span><span style="display:flex;"><span>name = &#34;example-greeter&#34; |
| </span></span><span style="display:flex;"><span>version = &#34;0.1.0&#34; |
| </span></span><span style="display:flex;"><span>edition = &#34;2021&#34; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>[dependencies] |
| </span></span><span style="display:flex;"><span>dubbo = &#34;0.1.0&#34; |
| </span></span><span style="display:flex;"><span>dubbo-config = &#34;0.1.0&#34; |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>[build-dependencies] |
| </span></span><span style="display:flex;"><span>dubbo-build = &#34;0.1.0&#34; |
| </span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span>�3. 编译 IDL 并根据生成的 stub 编写逻辑 |
| </span></span><span style="display:flex;"><span>编写 Dubbo Server |
| </span></span><span style="display:flex;"><span>```rust |
| </span></span><span style="display:flex;"><span>#[tokio::main] |
| </span></span><span style="display:flex;"><span>async fn main() { |
| </span></span><span style="display:flex;"><span> register_server(GreeterServerImpl { |
| </span></span><span style="display:flex;"><span> name: &#34;greeter&#34;.to_string(), |
| </span></span><span style="display:flex;"><span> }); |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> // Dubbo::new().start().await; |
| </span></span><span style="display:flex;"><span> Dubbo::new() |
| </span></span><span style="display:flex;"><span> .with_config({ |
| </span></span><span style="display:flex;"><span> let r = RootConfig::new(); |
| </span></span><span style="display:flex;"><span> match r.load() { |
| </span></span><span style="display:flex;"><span> Ok(config) =&gt; config, |
| </span></span><span style="display:flex;"><span> Err(_err) =&gt; panic!(&#34;err: {:?}&#34;, _err), // response was droped |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span> }) |
| </span></span><span style="display:flex;"><span> .start() |
| </span></span><span style="display:flex;"><span> .await; |
| </span></span><span style="display:flex;"><span>} |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>struct GreeterServerImpl { |
| </span></span><span style="display:flex;"><span> name: String, |
| </span></span><span style="display:flex;"><span>} |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span>impl Greeter for GreeterServerImpl { |
| </span></span><span style="display:flex;"><span> async fn greet( |
| </span></span><span style="display:flex;"><span> &amp;self, |
| </span></span><span style="display:flex;"><span> request: Request&lt;GreeterRequest&gt;, |
| </span></span><span style="display:flex;"><span> ) -&gt; Result&lt;Response&lt;GreeterReply&gt;, dubbo::status::Status&gt; { |
| </span></span><span style="display:flex;"><span> println!(&#34;GreeterServer::greet {:?}&#34;, request.metadata); |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> Ok(Response::new(GreeterReply { |
| </span></span><span style="display:flex;"><span> message: &#34;hello, dubbo-rust&#34;.to_string(), |
| </span></span><span style="display:flex;"><span> })) |
| </span></span><span style="display:flex;"><span> } |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><p>� |
| 编写 Dubbo Client</p> |
| <div class="highlight"><pre tabindex="0" style="color:#93a1a1;background-color:#002b36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-rust" data-lang="rust"><span style="display:flex;"><span><span style="color:#719e07">#[tokio::main]</span> |
| </span></span><span style="display:flex;"><span><span style="color:#719e07">async</span> <span style="color:#719e07">fn</span> <span style="color:#268bd2">main</span>() { |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">let</span> <span style="color:#719e07">mut</span> cli <span style="color:#719e07">=</span> GreeterClient::new().with_uri(<span style="color:#2aa198">&#34;http://127.0.0.1:8888&#34;</span>.to_string()); |
| </span></span><span style="display:flex;"><span> |
| </span></span><span style="display:flex;"><span> println!(<span style="color:#2aa198">&#34;# unary call&#34;</span>); |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">let</span> resp <span style="color:#719e07">=</span> cli |
| </span></span><span style="display:flex;"><span> .greet(Request::new(GreeterRequest { |
| </span></span><span style="display:flex;"><span> name: <span style="color:#2aa198">&#34;message from client&#34;</span>.to_string(), |
| </span></span><span style="display:flex;"><span> })) |
| </span></span><span style="display:flex;"><span> .<span style="color:#719e07">await</span>; |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">let</span> resp <span style="color:#719e07">=</span> <span style="color:#719e07">match</span> resp { |
| </span></span><span style="display:flex;"><span> <span style="color:#b58900">Ok</span>(resp) <span style="color:#719e07">=&gt;</span> resp, |
| </span></span><span style="display:flex;"><span> <span style="color:#b58900">Err</span>(err) <span style="color:#719e07">=&gt;</span> <span style="color:#719e07">return</span> println!(<span style="color:#2aa198">&#34;</span><span style="color:#2aa198">{:?}</span><span style="color:#2aa198">&#34;</span>, err), |
| </span></span><span style="display:flex;"><span> }; |
| </span></span><span style="display:flex;"><span> <span style="color:#268bd2">let</span> (_parts, body) <span style="color:#719e07">=</span> resp.into_parts(); |
| </span></span><span style="display:flex;"><span> println!(<span style="color:#2aa198">&#34;Response: </span><span style="color:#2aa198">{:?}</span><span style="color:#2aa198">&#34;</span>, body); |
| </span></span><span style="display:flex;"><span>} |
| </span></span></code></pre></div><p>这样,一个简单的 Dubbo Rust 示例就开发完成了,可以到 Dubbo 官网查看完整文档。</p> |
| <h2 id="3-roadmap-与未来规划">3 Roadmap 与未来规划</h2> |
| <p>Dubbo Rust Roadmap 规划分为三个阶段:</p> |
| <ul> |
| <li>首先,提供作为 RPC 框架的基础能力,此阶段重点完成的包括基于 HTTP/2 的 RPC 通信、基于 IDL 的 RPC 定义、其他必要的 RPC 内核组件等</li> |
| <li>其实,是完善 Dubbo Rust 作为微服务框架的高级功能,此阶段包括微服务定义、配置、功能设计等,如服务超时、异步调用、上下文传递等,具体可参见 Dubbo Java 的高级特性。</li> |
| <li>第三阶段重点是引入丰富的服务治理能力支持,如流量治理、限流降级、可观测性等,这一目标将主要通过融入 Dubbo Mesh 体系,即适配 Dubbo Mesh 控制面实现。</li> |
| </ul> |
| <p>其中,第一阶段的工作已经基本完成,大家可通过上文的 Quick Start 进行深入体验,第二、第三阶段的工作已经在社区全面开展,欢迎感兴趣的社区开发者参与进来,具体联系方式参见下文。</p> |
| <p>下图是侧重从第一阶段(RPC框架)、第二阶段(微服务开发框架)的视角对当前 Dubbo Rust 功能完备性的评估和任务拆解。</p> |
| <p><img src="https://dubbo.apache.org/imgs/rust/dubbo-rust-tasks.png" alt="dubbo-rust"></p> |
| <p>上图中都是 Dubbo Rust 核心设计的重要组件,保证 Dubbo Rust 具备微服务框架中完整的 RPC 通信能力以及服务治理能力。</p> |
| <ul> |
| <li>Protocol、Filter、Listener、Connector 等组件都是 RPC 通信核心能力</li> |
| <li>服务注册发现、负载均衡、Cluster、Metadata 为后续服务治理能力做铺垫</li> |
| </ul> |
| <p>除了上图列出的模块以外,还有一些非功能需求也需要支持,例如:</p> |
| <ul> |
| <li>Dubbo 多语言框架之间相互通信测试</li> |
| <li>性能验证与持续的 benchmark 机制</li> |
| <li>整体架构的持续优化,如核心配置简化以及相应的文档完善</li> |
| </ul> |
| <h2 id="4-参与-dubbo-rust-社区">4 参与 Dubbo Rust 社区</h2> |
| <p>和 Rust 语言一样,Dubbo Rust 是一个非常有活力、非常前沿的社区,另一方面,依赖 Apache Dubbo 社区背后庞大的开发者群体和企业用户,Dubbo Rust 有着非常深厚的用户基础和发展潜力。Dubbo Rust 的快速发展期待社区贡献者的加入 |
| 参与 Dubbo Rust 社区可以收获</p> |
| <ul> |
| <li>见证 Dubbo Rust 开源项目的建设以及发展</li> |
| <li>在大型项目中通过实际使用学习 Rust 语言,加深对 Rust 语言的理解</li> |
| <li>获得提名为 Apache Dubbo CommitterPMC</li> |
| <li>借助 Dubbo 社区提高个人曝光度,提高个人技术影响力</li> |
| <li>与阿里巴巴等企业专家的面对面交流机会,快速提高技术视野</li> |
| </ul> |
| <p>参与 Dubbo Rust 社区的方式有如下几种</p> |
| <ul> |
| <li>搜索并加入钉钉群并参与社区双周会,钉钉群号 <strong>44694199</strong></li> |
| <li>到 GitHub 提 Issue 或贡献代码 <a href="https://github.com/apache/dubbo-rust">https://github.com/apache/dubbo-rust</a></li> |
| </ul></description></item></channel></rss> |