Rust使用gRPC

需要先安装protoc (Protocol Buffers Compiler),可据此Protobuf Compiler Installation下载

第一步:创建项目

  1. 创建两个新的Rust项目,分别作为服务端与客户端:

    复制代码
    cargo new rust_grpc_server
    
    cargo new rust_grpc_client
  2. 分别在项目根目录创建proto文件夹,并在其中创建一个叫hello.proto的文件

第二步:编写.proto文件

proto/hello.proto文件中分别写入以下内容:

复制代码
syntax = "proto3";

package hello;

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings.
message HelloReply {
  string message = 1;
}

第三步:添加依赖

在server的项目的Cargo.toml文件中添加以下依赖:

复制代码
[dependencies]
tonic = "0.6"
tokio = { version = "1", features = ["full"] }
prost = "0.9"

[build-dependencies]
tonic-build = "0.6"

在client的项目的Cargo.toml文件中添加以下依赖:

复制代码
[dependencies]
tonic = "0.6"
tokio = { version = "1", features = ["full"] }
prost = "0.9"
rand = "0.8"

[build-dependencies]
tonic-build = "0.6"

第四步:创建build脚本

分别在根目录创建一个build.rs文件,添加以下代码, 根据.proto文件生成相应的Rust代码:

复制代码
fn main() {
    tonic_build::compile_protos("proto/hello.proto")
        .expect("Failed to compile proto files");
}

最终生成的代码类似

第五步:编写gRPC服务器

在server项目的src/main.rs中,创建一个gRPC服务器:

复制代码
use std::time::SystemTime;
use tonic::{transport::Server, Request, Response, Status};

pub mod hello {
    tonic::include_proto!("hello");
}

use hello::greeter_server::{Greeter, GreeterServer};
use hello::{HelloReply, HelloRequest};

#[derive(Default)]
pub struct MyGreeter {}

#[tonic::async_trait]
impl Greeter for MyGreeter {
    async fn say_hello(
        &self,
        request: Request<HelloRequest>,
    ) -> Result<Response<HelloReply>, Status> {
        let reply = hello::HelloReply {
            message: format!(
                "Hello {}!,Current Time is {:?}",
                request.into_inner().name,
                SystemTime::now()
            ),
        };

        Ok(Response::new(reply))
    }
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let addr = "[::1]:50051".parse()?;
    let greeter = MyGreeter::default();

    println!("GreeterServer listening on {}", addr);

    Server::builder()
        .add_service(GreeterServer::new(greeter))
        .serve(addr)
        .await?;

    Ok(())
}

第六步:编写gRPC客户端

在client项目的src/main.rs文件中,添加一个客户端来测试服务器:

复制代码
use rand::Rng;

pub mod hello {
    tonic::include_proto!("hello");
}

use hello::HelloRequest;

#[derive(Default)]
pub struct MyGreeter {}

// 客户端代码
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {

    // 客户端测试
    let mut client = hello::greeter_client::GreeterClient::connect("http://[::1]:50051").await?;

    // 随机选择一个字符串出来
    let names = ["张三", "李四", "王五"];

    let mut rng = rand::thread_rng();

    let random_name = names[rng.gen_range(0..names.len())];

    let request = tonic::Request::new(HelloRequest {
        name: random_name.into(),
    });

    let response = client.say_hello(request).await?;

    println!("RESPONSE={:?}", response.into_inner().message);

    Ok(())
}

编译和运行

  1. 在server项目根目录执行 cargo run来编译和运行项目,服务器将启动并监听在 [::1]:50051
  1. 在client项目根目录执行 cargo run来编译和运行项目,客户端将发送一个请求并打印出服务端的响应内容

本文由mdnice多平台发布

相关推荐
野犬寒鸦4 小时前
从零起步学习并发编程 || 第一章:初步认识进程与线程
java·服务器·后端·学习
我爱娃哈哈4 小时前
SpringBoot + Flowable + 自定义节点:可视化工作流引擎,支持请假、报销、审批全场景
java·spring boot·后端
李梨同学丶6 小时前
0201好虫子周刊
后端
思想在飞肢体在追6 小时前
Springboot项目配置Nacos
java·spring boot·后端·nacos
Loo国昌8 小时前
【垂类模型数据工程】第四阶段:高性能 Embedding 实战:从双编码器架构到 InfoNCE 损失函数详解
人工智能·后端·深度学习·自然语言处理·架构·transformer·embedding
ONE_PUNCH_Ge9 小时前
Go 语言泛型
开发语言·后端·golang
良许Linux9 小时前
DSP的选型和应用
后端·stm32·单片机·程序员·嵌入式
不光头强9 小时前
spring boot项目欢迎页设置方式
java·spring boot·后端
怪兽毕设10 小时前
基于SpringBoot的选课调查系统
java·vue.js·spring boot·后端·node.js·选课调查系统
学IT的周星星10 小时前
Spring Boot Web 开发实战:第二天,从零搭个“会卖萌”的小项目
spring boot·后端·tomcat