草庐IT

Apache Dubbo 多语言体系再添新员:首个 Rust 语言版本正式发布

apache-dubbo 2023-04-16 原文

Dubbo Rust 定位为 Dubbo 多语言体系的重要实现,提供高性能、易用、可扩展的 RPC 框架,同时通过接入 Dubbo Mesh 体系提供丰富的服务治理能力。本文主要为大家介绍 Dubbo Rust 项目基本情况,通过一个示例快速体验 Rust 首个正式版本特性,并给出了 Dubbo Rust 社区的近期规划,适合于关注或正在学习 Rust 语言的开发者与企业用户阅读。

完整示例可以直接访问项目官网 Dubbo Rust Quick Start 或搜索关注官方微信公众号:Apache Dubbo

1 Dubbo Rust 简介

Dubbo 作为 Apache 基金会最活跃的明星项目之一,同时也是国内最受欢迎的开源微服务框架,在易用性、高性能通信、服务治理等方面有着非常大的优势,通过 Dubbo3、Dubbo Mesh 等提供了云原生友好的开发与部署模式。与此同时,Dubbo 的多语言体系也得到了快速发展,长期以来提供的有 Java、Golang 两种语言实现,Rust、Node、Python、C++ 等语言实现的支持也已在社区正式启动。

Dubbo Rust 目标是对齐 Dubbo3 的所有核心功能设计,包括基于 HTTP/2 的高性能通信、用户友好的微服务开发编程模式、通过接入DubboMesh提供丰富的服务治理能力等,相比于其他语言实现,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 具有如下特点:易用性、高性能以及可扩展,同时面向云原生提供丰富的服务治理能力。

2 快速体验 Dubbo Rust

2.1 首个版本核心能力

Dubbo Rust 首个正式版本为 v0.2.0,v0.2.0 提供的能力包括

  • 基于 HTTP/2 的 Triple 协议的基础通信能力
  • 基于 IDL 的 RPC 定义支持,Protobuf 来生成代码,同时支持 Serde 序列化
  • request-response、request/response streaming、bi-streaming 通信模型支持
  • 设计了简洁的、可扩展的架构,支持对 Listener、Connector、Filter、Protocol以及Invoker组件进行扩展

Dubbo Rust v0.2.0 的核心组件及通信流程如下图所示

核心架构已经基本完成,接下来的版本将重点关注核心组件的扩展以及服务治理相关组件的设计实现。

2.2 Quick Start

完整示例可查看 【Dubbo官网】 -> 【Rust SDK 文档】。
https://dubbo.apache.org/zh/docs3-v2/rust-sdk/quick-start/

使用 Dubbo Rust 服务开发的基本步骤为

  1. 使用 IDL 定义服务

  2. 添加 Dubbo Rust 依赖到项目

  3. 编译 IDL

  4. 基于 IDL 编译生成的 stub 编写 Server & Client 逻辑

  5. 运行项目

  6. 使用 IDL 定义 Dubb 服务

// ./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);
}
  1. 增加 Dubbo Rust 依赖
# ./Cargo.toml
[package]
name = "example-greeter"
version = "0.1.0"
edition = "2021"

[dependencies]
dubbo = "0.1.0"
dubbo-config = "0.1.0"

[build-dependencies]
dubbo-build = "0.1.0"
  1. 编译 IDL 并根据生成的 stub 编写逻辑
    编写 Dubbo Server
#[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;
}

struct GreeterServerImpl {
    name: String,
}

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(),
        }))
    }
}

编写 Dubbo Client

#[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);
}

这样,一个简单的 Dubbo Rust 示例就开发完成了,可以到 Dubbo 官网查看完整文档。

3 Roadmap 与未来规划

Dubbo Rust Roadmap 规划分为三个阶段:

  • 首先,提供作为 RPC 框架的基础能力,此阶段重点完成的包括基于 HTTP/2 的 RPC 通信、基于 IDL 的 RPC 定义、其他必要的 RPC 内核组件等
  • 其实,是完善 Dubbo Rust 作为微服务框架的高级功能,此阶段包括微服务定义、配置、功能设计等,如服务超时、异步调用、上下文传递等,具体可参见 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 机制
  • 整体架构的持续优化,如核心配置简化以及相应的文档完善

4 参与 Dubbo Rust 社区

和 Rust 语言一样,Dubbo Rust 是一个非常有活力、非常前沿的社区,另一方面,依赖 Apache Dubbo 社区背后庞大的开发者群体和企业用户,Dubbo Rust 有着非常深厚的用户基础和发展潜力。Dubbo Rust 的快速发展期待社区贡献者的加入
参与 Dubbo Rust 社区可以收获

  • 见证 Dubbo Rust 开源项目的建设以及发展
  • 在大型项目中通过实际使用学习 Rust 语言,加深对 Rust 语言的理解
  • 获得提名为 Apache Dubbo CommitterPMC
  • 借助 Dubbo 社区提高个人曝光度,提高个人技术影响力
  • 与阿里巴巴等企业专家的面对面交流机会,快速提高技术视野

参与 Dubbo Rust 社区的方式有如下几种

搜索关注官方微信公众号:Apache Dubbo,了解更多业界最新动态,掌握大厂面试必备 Dubbo 技能

有关Apache Dubbo 多语言体系再添新员:首个 Rust 语言版本正式发布的更多相关文章

  1. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  2. ruby-on-rails - 如何在发布新的 Ruby 或 Rails 版本时收到通知? - 2

    有人知道在发布新版本的Ruby和Rails时收到电子邮件的方法吗?他们有邮件列表,RubyonRails有一个推特,但我不想听到那些随之而来的喧嚣,我只想知道什么时候发布新版本,尤其是那些有安全修复的版本。 最佳答案 从therailsblog获取提要.http://weblog.rubyonrails.org/feed/atom.xml 关于ruby-on-rails-如何在发布新的Ruby或Rails版本时收到通知?,我们在StackOverflow上找到一个类似的问题:

  3. ruby-on-rails -/usr/local/lib/libz.1.dylib,文件是为 i386 构建的,它不是被链接的体系结构 (x86_64) - 2

    在我的mac上安装几个东西时遇到这个问题,我认为这个问题来自将我的豹子升级到雪豹。我认为这个问题也与macports有关。/usr/local/lib/libz.1.dylib,filewasbuiltfori386whichisnotthearchitecturebeinglinked(x86_64)有什么想法吗?更新更具体地说,这发生在安装nokogirigem时日志看起来像:xslt_stylesheet.c:127:warning:passingargument1of‘Nokogiri_wrap_xml_document’withdifferentwidthduetoproto

  4. ruby-on-rails - 获取 ActionController::RoutingError(当尝试使用 AngularJS 将数据发布到 Rails 服务器时,没有路由匹配 [OPTIONS] "/users" - 2

    尝试从我的AngularJS端将数据发布到Rails服务器时出现问题。服务器错误:ActionController::RoutingError(Noroutematches[OPTIONS]"/users"):actionpack(4.1.9)lib/action_dispatch/middleware/debug_exceptions.rb:21:in`call'actionpack(4.1.9)lib/action_dispatch/middleware/show_exceptions.rb:30:in`call'railties(4.1.9)lib/rails/rack/logg

  5. iNFTnews | 周杰伦18年前未发布的作品Demo,藏在了区块链技术里 - 2

    当音乐碰上区块链技术,会擦出怎样的火花?或许周杰伦已经给了我们答案。8月29日下午,B站独家首发周杰伦限定珍藏Demo独家访谈VCR,周杰伦在VCR里分享了《晴天》《青花瓷》《搁浅》《爱在西元前》四首经典歌曲Demo背后的创作故事,并首次公布18年前未发布的神秘作品《纽约地铁》的Demo。在VCR中,方文山和杰威尔音乐提及到“多亏了区块链技术,现在我们可以将这些Demos,变成独一无二具有收藏价值的艺术品,这些Demos可以在薄盒(国内数藏平台)上听到。”如何将音乐与区块链技术相结合,薄盒方面称:“薄盒作为区块链技术服务方,打破传统对于区块链技术只能作为数字收藏的理解。聚焦于区块链技术赋能,在

  6. ruby - 如何在 Ruby 中从内存中 HTTP 发布流数据? - 2

    我想上传我在运行时用Ruby生成的数据,就像从block中提供上传数据一样。我找到的所有示例仅展示了如何流式传输必须在请求之前位于磁盘上的文件,但我不想缓冲该文件。除了滚动我自己的套接字连接之外,最好的解决方案是什么?这是一个伪代码示例:post_stream('127.0.0.1','/stream/')do|body|generate_xmldo|segment|body 最佳答案 有效的代码。require'thread'require'net/http'require'base64'require'openssl'class

  7. IDEA 2023.1 正式发布,新特性简介 - 2

     昨晚看到IDEA官推宣布IntelliJIDEA2023.1正式发布了。简单看了一下,发现这次的新版本包含了许多改进,进一步优化了用户体验,提高了便捷性。至于是否升级最新版本完全是个人意愿,如果觉得新版本没有让自己感兴趣的改进,完全就不用升级,影响不大。软件的版本迭代非常正常,正确看待即可,不持续改进就会慢慢被淘汰!根据官方介绍:IntelliJIDEA2023.1针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施,使得Maven导入更快,并且在打开项目时IDE功能更早地可用。由于后台提交检查,新版本提供了简化的提交流程。IntelliJIDEA

  8. Unity数据可视化图表插件XCharts3.0发布 - 2

    Unity数据可视化图表插件XCharts3.0发布历时8个多月,业余时间,断断续续,XCharts3.0总算发布了。如果要打个满意度,我给3.0版本来个80分。对于代码框架结构设计的调整改动,基本符合预期,甚是满意。相比之前的1.0和2.0版本,我认为3.0才是一个拿得出手给广大开发者使用的版本。1.0发布的时候,很兴奋,从0.1到1.0,也磨了一年,真的等不及想给大家试用了,还特地写过一篇文章以示庆祝。那个时候,1.0虽然还还不够完善,功能也不够丰富,但它是XCharts的开始,没有1.0,也就没有后面的2.0和3.0。后面的2.0发布,做了很多改进和优化,随着版本迭代,慢慢的发现有不少硬

  9. ruby-on-rails - 在 Rails 中是否有比 Observers 更直接的方式来执行发布/订阅模式? - 2

    我有一个模型依赖于一个单独的、联合的模型。classMagazine图像是多态的,可以附加到许多对象(页面和文章),而不仅仅是杂志。杂志需要在相关图像发生任何变化时自行更新该杂志还保存了一张自己的截图,可用于宣传:classMagazine现在如果图像发生变化,杂志也需要更新其截图。所以杂志真的需要知道图片什么时候出了问题。所以我们可以天真地直接从封面图片触发屏幕截图更新classImage...但是图片不应该代表杂志做事然而,图片可以用于许多不同的对象,实际上不应该对杂志进行特定的操作,因为这不是图片的责任。该图像也可能附加到页面或文章,并且不需要为它们做各种事情。“正常”的rail

  10. ruby - 使用 Ruby FFI 调用 Rust 库时出现段错误 - 2

    我想将String传递给Rust库,但它总是会抛出段错误。代码如下://lib.rs#[no_mangle]pubexternfnprocess(foo:String)->String{foo}还有Ruby文件:#embed.rbrequire'ffi'moduleHelloextendFFI::Libraryffi_lib'target/release/libembed.dylib'attach_function:process,[:string],:stringendputsHello.process("foo") 最佳答案 免

随机推荐