RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

用Rust語(yǔ)言開(kāi)發(fā)微服務(wù)

jf_wN0SrCdH ? 來(lái)源:Apache Dubbo ? 作者:Dubbo Rust 社區(qū) ? 2022-10-28 09:31 ? 次閱讀

Dubbo Rust 近期發(fā)布了首個(gè)正式版本,Dubbo Rust 目標(biāo)是對(duì)齊 Dubbo 3 的所有核心功能設(shè)計(jì),包括基于 HTTP/2 的高性能通信、用戶(hù)友好的微服務(wù)開(kāi)發(fā)編程模式、通過(guò)接入Dubbo Mesh提供豐富的服務(wù)治理能力等。相比于其他語(yǔ)言實(shí)現(xiàn),Dubbo Rust 將很好的利用 Rust 語(yǔ)言極致性能、安全和指令級(jí)掌控能力的特點(diǎn)。

1?

前置條件

安裝 Rust 開(kāi)發(fā)環(huán)境

安裝 protoc 工具

2?

使用 IDL 定義 Dubbo 服務(wù)

Greeter 服務(wù)定義如下,包含一個(gè) Unary(Request - Response)模型的 Dubbo 服務(wù)。

// ./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 及相關(guān)依賴(lài)到項(xiàng)目

# ./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

在項(xiàng)目根目錄創(chuàng)建(注意不是 src 目錄),創(chuàng)建 build.rs 文件并添加以下內(nèi)容:

// ./build.rs
fn main() {
    dubbo_build::configure()
        .compile(&["proto/greeter.proto"], &["proto/"])
        .unwrap();
}

這樣配置之后,編譯項(xiàng)目就可以生成 Dubbo Stub 相關(guān)代碼。

路徑一般在:

./target/debug/build/example-greeter/out/org.apache.dubbo.sample.tri.rs

5?

編寫(xiě) Dubbo 業(yè)務(wù)代碼

5.1

編寫(xiě) 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 端的配置,包括暴露的服務(wù)列表、協(xié)議配置、監(jiān)聽(tīng)配置等。

# ./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

編寫(xiě) 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?

運(yùn)行并總結(jié)

6.1

編譯

執(zhí)行 cargo build 來(lái)編譯 Server 和 Client。

6.2

運(yùn)行 Server

執(zhí)行 ./target/debug/greeter-server 來(lái)運(yùn)行 Server,如上文 dubbo.yaml 所配置,Server 會(huì)監(jiān)聽(tīng) 8888 端口,并以 triple 協(xié)議提供 RPC 服務(wù)。

$ ./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

運(yùn)行 Client,驗(yàn)證調(diào)用是否成功

執(zhí)行 ./target/debug/greeter-client 來(lái)運(yùn)行 Client,調(diào)用triple://127.0.0.1:8888/org.apache.dubbo.sample.tri.Greeter 下的各種方法。

$ ./target/debug/greeter-client
Response: GreeterReply { message: "hello, dubbo-rust" }






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    504

    瀏覽量

    31194
  • IDL
    IDL
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    7643
  • rust語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    3009

原文標(biāo)題:用 Rust 語(yǔ)言開(kāi)發(fā)微服務(wù):Dubbo Rust 首個(gè)正式版本初體驗(yàn)

文章出處:【微信號(hào):Rust語(yǔ)言中文社區(qū),微信公眾號(hào):Rust語(yǔ)言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于Rust語(yǔ)言Hash特征的基礎(chǔ)用法和進(jìn)階用法

    Rust語(yǔ)言是一種系統(tǒng)級(jí)編程語(yǔ)言,具有高性能、安全、并發(fā)等特點(diǎn),是近年來(lái)備受關(guān)注的新興編程語(yǔ)言。在Rust
    的頭像 發(fā)表于 09-19 16:02 ?1439次閱讀

    Rust語(yǔ)言如何與 InfluxDB 集成

    Rust 是一種系統(tǒng)級(jí)編程語(yǔ)言,具有高性能和內(nèi)存安全性。InfluxDB 是一個(gè)開(kāi)源的時(shí)間序列數(shù)據(jù)庫(kù),用于存儲(chǔ)、查詢(xún)和可視化大規(guī)模數(shù)據(jù)集。Rust 語(yǔ)言可以與 InfluxDB 集成,
    的頭像 發(fā)表于 09-30 16:45 ?1149次閱讀

    如何用 rust 語(yǔ)言開(kāi)發(fā) stm32

    本文介紹如何用 rust 語(yǔ)言開(kāi)發(fā) stm32。開(kāi)發(fā)平臺(tái)為 linux(gentoo)。硬件準(zhǔn)備本文使用的芯片為 STM32F103C8T6。該芯片性?xún)r(jià)比較高,價(jià)格低廉,適合入門(mén)學(xué)習(xí)。
    發(fā)表于 11-26 06:20

    微服務(wù)網(wǎng)關(guān)gateway的相關(guān)資料推薦

    目錄微服務(wù)網(wǎng)關(guān) gateway 概述[路由器網(wǎng)關(guān) Zuul 概述]嵌入式 Zuul 反向代理微服務(wù)網(wǎng)關(guān) gateway 概述1、想象一下一個(gè)購(gòu)物應(yīng)用程序的產(chǎn)品詳情頁(yè)面展示了指定商品的信息:2、若是
    發(fā)表于 12-23 08:19

    java微服務(wù)架構(gòu)有哪些

    本文首先簡(jiǎn)單介紹了微服務(wù)的概念以及使用微服務(wù)所能帶來(lái)的優(yōu)勢(shì),然后結(jié)合實(shí)例介紹了幾個(gè)常見(jiàn)的Java微服務(wù)框架。微服務(wù)開(kāi)發(fā)領(lǐng)域的應(yīng)用越來(lái)越廣泛
    的頭像 發(fā)表于 02-09 10:34 ?8654次閱讀
    java<b class='flag-5'>微服務(wù)</b>架構(gòu)有哪些

    微服務(wù)優(yōu)勢(shì)_微服務(wù)架構(gòu)的好處與不足

    是相互獨(dú)立的,所以不同的服務(wù)可以使用不同的語(yǔ)言來(lái)開(kāi)發(fā),或者根據(jù)業(yè)務(wù)的需求使用不同類(lèi)型的數(shù)據(jù)庫(kù)??偠灾?,微服務(wù)架構(gòu)有很多吸引人的地方,不過(guò)在擁抱微服
    發(fā)表于 02-23 11:24 ?4393次閱讀

    Python微服務(wù)開(kāi)發(fā)的源代碼合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是Python微服務(wù)開(kāi)發(fā)的源代碼合集免費(fèi)下載。
    發(fā)表于 09-20 08:00 ?3次下載

    微軟開(kāi)發(fā)基于Rust的新編程語(yǔ)言,將很快開(kāi)源

    此前,微軟表示正探索將Rust作為C和C++的安全替代方案,并且也對(duì)外展示了使用Rust重寫(xiě)Windows組件的體驗(yàn),根據(jù)微軟的說(shuō)法,Rust是一種從根本上考慮安全性的編程語(yǔ)言,他們將
    的頭像 發(fā)表于 12-03 10:36 ?3912次閱讀

    一個(gè)Rust開(kāi)發(fā)的壓測(cè)工具rsb

    一個(gè) Rust 開(kāi)發(fā)的壓測(cè)工具,項(xiàng)目地址:rsb,給個(gè) star 鼓勵(lì)下。
    的頭像 發(fā)表于 03-21 09:32 ?879次閱讀

    微服務(wù)為什么要用到API網(wǎng)關(guān)?

    微服務(wù)架構(gòu)(通常簡(jiǎn)稱(chēng)為微服務(wù))是指開(kāi)發(fā)應(yīng)用所用的一種架構(gòu)形式。通過(guò)微服務(wù),可將大型應(yīng)用分解成多個(gè)獨(dú)立的組件,其中每個(gè)組件都有各自的責(zé)任領(lǐng)域。
    的頭像 發(fā)表于 04-14 09:17 ?738次閱讀

    適合嵌入式設(shè)備開(kāi)發(fā)的編程語(yǔ)言Rust語(yǔ)言

    Rust語(yǔ)言是二十一世紀(jì)的語(yǔ)言新星。Rust被人廣泛承認(rèn)的一點(diǎn),就是因?yàn)樗苓\(yùn)行在多樣的目標(biāo)上,從桌面和服務(wù)器設(shè)備,到資源有限的嵌入式設(shè)備。
    發(fā)表于 09-12 09:39 ?2962次閱讀
    適合嵌入式設(shè)備<b class='flag-5'>開(kāi)發(fā)</b>的編程<b class='flag-5'>語(yǔ)言</b>—<b class='flag-5'>Rust</b><b class='flag-5'>語(yǔ)言</b>

    基于Rust開(kāi)發(fā)的編程語(yǔ)言

    Move 是一門(mén)由 Rust 語(yǔ)言開(kāi)發(fā)的一門(mén)面向資產(chǎn)的編程語(yǔ)言,最早由 Facebook (現(xiàn) Meta )投入大量的人力物力開(kāi)發(fā),用于 L
    的頭像 發(fā)表于 11-17 12:30 ?671次閱讀

    springcloud微服務(wù)架構(gòu)

    Spring Cloud是一個(gè)開(kāi)源的微服務(wù)架構(gòu)框架,它提供了一系列工具和組件,用于構(gòu)建和管理分布式系統(tǒng)中的微服務(wù)。它基于Spring框架,旨在通過(guò)簡(jiǎn)化開(kāi)發(fā)過(guò)程和降低系統(tǒng)復(fù)雜性來(lái)幫助開(kāi)發(fā)
    的頭像 發(fā)表于 11-23 09:24 ?1314次閱讀

    設(shè)計(jì)微服務(wù)架構(gòu)的原則

    微服務(wù)是一種軟件架構(gòu)策略,有利于改善整體性能和可擴(kuò)展性。你可能會(huì)想,我的團(tuán)隊(duì)需不需要采用微服務(wù),設(shè)計(jì)微服務(wù)架構(gòu)有哪些原則?本文會(huì)給你一些靈感。文章速覽:微服務(wù)設(shè)計(jì)的要素
    的頭像 發(fā)表于 11-26 08:05 ?583次閱讀
    設(shè)計(jì)<b class='flag-5'>微服務(wù)</b>架構(gòu)的原則

    如何構(gòu)建彈性、高可用的微服務(wù)?

    基于微服務(wù)的應(yīng)用程序可實(shí)現(xiàn)戰(zhàn)略性數(shù)字轉(zhuǎn)型和云遷移計(jì)劃,對(duì)于開(kāi)發(fā)團(tuán)隊(duì)來(lái)說(shuō),這種架構(gòu)十分重要。那么,如何來(lái)構(gòu)建彈性、高可用的微服務(wù)呢?RedisEnterprise給出了一個(gè)完美的方案。文況速覽
    的頭像 發(fā)表于 11-26 08:06 ?473次閱讀
    如何構(gòu)建彈性、高可用的<b class='flag-5'>微服務(wù)</b>?
    RM新时代网站-首页