0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

用Rust语言开发微服务

jf_wN0SrCdH 来源:Apache Dubbo 作者:Dubbo Rust 社区 2022-10-28 09:31 次阅读

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

    文章

    467

    浏览量

    30319
  • IDL
    IDL
    +关注

    关注

    0

    文章

    19

    浏览量

    7622
  • rust语言
    +关注

    关注

    0

    文章

    58

    浏览量

    2958

原文标题:用 Rust 语言开发微服务:Dubbo Rust 首个正式版本初体验

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    聊聊Rust与C语言交互的具体步骤

    rust FFI 是rust与其他语言互调的桥梁,通过FFI rust 可以有效继承 C 语言的历史资产。本期通过几个例子来聊聊
    发表于 07-06 11:15 1021次阅读

    Rust语言如何与 InfluxDB 集成

    Rust 是一种系统级编程语言,具有高性能和内存安全性。InfluxDB 是一个开源的时间序列数据库,用于存储、查询和可视化大规模数据集。Rust 语言可以与 InfluxDB 集成,
    的头像 发表于 09-30 16:45 620次阅读

    微服务架构和CQRS架构基本概念介绍

    微服务架构现在很热,到处可以看到各大互联网公司的微服务实践的分享总结。但是,我今天的分享和微服务没有关系,希望可以带给大家一些新的东西。如果一定要说微服务和CQRS架构的关系,那我觉得
    发表于 05-22 09:03

    如何用 rust 语言开发 stm32

    本文介绍如何用 rust 语言开发 stm32。开发平台为 linux(gentoo)。硬件准备本文使用的芯片为 STM32F103C8T6。该芯片性价比较高,价格低廉,适合入门学习。
    发表于 11-26 06:20

    微服务网关gateway的相关资料推荐

    目录微服务网关 gateway 概述[路由器网关 Zuul 概述]嵌入式 Zuul 反向代理微服务网关 gateway 概述1、想象一下一个购物应用程序的产品详情页面展示了指定商品的信息:2、若是
    发表于 12-23 08:19

    RUST在嵌入式开发中的应用是什么

    Rust是一种编程语言,它使用户能够构建可靠、高效的软件,尤其是用于嵌入式开发的软件。它的特点是:高性能:Rust具有惊人的速度和高内存利用率。可靠性:在编译过程中可以消除内存错误。生
    发表于 12-24 08:34

    如何在STM32 (Cortex M3)和GD32(RISC-V)上Rust开发

    Preface最近 Mozilla 的 Rust 和 Google 的 Golang 两门新语言非常受关注。不过 Golang 除了 Docker 这个标志性的项目,在服务端配合 gRPC 也已经
    发表于 06-21 10:38

    java微服务架构有哪些

    本文首先简单介绍了微服务的概念以及使用微服务所能带来的优势,然后结合实例介绍了几个常见的Java微服务框架。微服务开发领域的应用越来越广泛
    的头像 发表于 02-09 10:34 8375次阅读
    java<b class='flag-5'>微服务</b>架构有哪些

    微服务优势_微服务架构的好处与不足

    是相互独立的,所以不同的服务可以使用不同的语言开发,或者根据业务的需求使用不同类型的数据库。总而言之,微服务架构有很多吸引人的地方,不过在拥抱微服
    发表于 02-23 11:24 4277次阅读

    微服务时代的复杂服务软件的开发综述

    微服务时代的软件系统变得越来越复杂,传统的软件开发理论、方法和技术不再适用。面向复杂服务软件开发的过程,微服务架构有着可扩展性强、灵活性高的
    发表于 04-23 10:14 0次下载
    <b class='flag-5'>微服务</b>时代的复杂<b class='flag-5'>服务</b>软件的<b class='flag-5'>开发</b>综述

    适合嵌入式设备开发的编程语言Rust语言

    Rust语言是二十一世纪的语言新星。Rust被人广泛承认的一点,就是因为它能运行在多样的目标上,从桌面和服务器设备,到资源有限的嵌入式设备。
    发表于 09-12 09:39 1635次阅读
    适合嵌入式设备<b class='flag-5'>开发</b>的编程<b class='flag-5'>语言</b>—<b class='flag-5'>Rust</b><b class='flag-5'>语言</b>

    基于Rust开发的编程语言

    Move 是一门由 Rust 语言开发的一门面向资产的编程语言,最早由 Facebook (现 Meta )投入大量的人力物力开发,用于 L
    的头像 发表于 11-17 12:30 351次阅读

    springcloud微服务架构

    Spring Cloud是一个开源的微服务架构框架,它提供了一系列工具和组件,用于构建和管理分布式系统中的微服务。它基于Spring框架,旨在通过简化开发过程和降低系统复杂性来帮助开发
    的头像 发表于 11-23 09:24 391次阅读

    设计微服务架构的原则

    微服务是一种软件架构策略,有利于改善整体性能和可扩展性。你可能会想,我的团队需不需要采用微服务,设计微服务架构有哪些原则?本文会给你一些灵感。文章速览:微服务设计的要素
    的头像 发表于 11-26 08:05 247次阅读
    设计<b class='flag-5'>微服务</b>架构的原则

    如何构建弹性、高可用的微服务

    基于微服务的应用程序可实现战略性数字转型和云迁移计划,对于开发团队来说,这种架构十分重要。那么,如何来构建弹性、高可用的微服务呢?RedisEnterprise给出了一个完美的方案
    的头像 发表于 11-26 08:06 238次阅读
    如何构建弹性、高可用的<b class='flag-5'>微服务</b>?