Rust使用gRPC

alt

需要先安装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 greetingrpc 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");
}

最终生成的代码类似 alt


第五步:编写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
alt
  1. 在client项目根目录执行 cargo run来编译和运行项目,客户端将发送一个请求并打印出服务端的响应内容
alt

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/594310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【操作系统习题】处理机调度与死锁

一、单选题 FCFS算法的就绪队列是按照进程的&#xff08;&#xff09;排列。 B A、等待时间 B、到达时间 C、响应时间 D、运行时间设有4个作业同时到达&#xff0c;每个作业的执行时间均为2个小时&#xff0c;它们在一台处理机上按单道方式执行&#xff0c;则平均周转时间为&a…

PAT 乙级 1042 字符统计

请编写程序&#xff0c;找出一段给定文字中出现最频繁的那个英文字母。 输入格式&#xff1a; 输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成&#xff0c;至少包含 1 个英文字母&#xff0c;以回车结束&#xff08;回车不算在内…

Winform中使用Fleck实现Websocket服务端并读取SQLite数据库中数据定时循环群发消息

场景 Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中&#xff1a; Winform中使用Websocket4Net实现Websocket客户端并定时存储接收数据到SQLite中-CSDN博客 Winform中操作Sqlite数据增删改查、程序启动时执行创建表初始化操作&#xff1a; Wi…

Vue3 结合typescript 组合式函数(2)

安装axios&#xff1a;npm install axios 1、hooks文件夹下新建useURLLoader 在APP.VUE中使用useURLLoader 使用Dog API 2、使用对象中的属性&#xff0c;必须使用toRefs&#xff0c;否则Reactive响应失效 3、使用泛型 结果&#xff1a;

C++不懂就问:std::vector的push_back和emplace_back函数的差别?

欢迎关注公众号(20YC编程)&#xff0c;视频号也有免费视频课程哦&#xff01; -今日内容- 1 emplace_back介绍 std::vector的emplace_back&#xff08;包括emplace&#xff09;函数是C11引入的新特性&#xff0c;用于在容器中直接构造元素&#xff0c;而不是先构造元素再插入…

3 - 字段约束|MySQL索引|MySQL用户管理

字段约束&#xff5c;MySQL索引&#xff5c;MySQL用户管理 字段约束主键外键 MySQL索引索引介绍优缺点索引使用规则索引的分类索引的管理 用户管理用户授权权限撤销 用户权限追加user表的使用 字段约束 设置在表头上&#xff0c;用来限制字段赋值 包括&#xff1a; 是否允许给…

基于深度学习的交通标志图像分类识别系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 本文详细探讨了一基于深度学习的交通标志图像识别系统。采用TensorFlow和Keras框架&#xff0c;利用卷积神经网络&#xff08;CNN&#xff09;进行模型训练和预测&#xff0c;并引入VGG16迁移学习…

MySQL基础学习: 由delete和insert操作导致的死锁问题

一、问题复现&#xff1a;表结构 CREATE TABLE user_props (user_id bigint NOT NULL ,prop_key varchar(100) NOT NULL ,prop_value varchar(100) NOT NULL,PRIMARY KEY (user_id,prop_key) )二、死锁测试 &#xff08;1&#xff09;开启两个事务 &#xff08;2&#xff09;…

QGIS设计导出Geoserver服务使用的SLD样式

1、打开QGis软件 2、打开shp文件所在所在文件夹&#xff0c;双击添加选中图层 3、编辑shp文件样式 &#xff08;1&#xff09;双击“Layers”中需要编辑的图层 &#xff08;2&#xff09;选择样式 &#xff08;3&#xff09;编辑样式后&#xff0c;选择“应用”—》“确定” 4…

安装MYsql5.7和8.0以及区别

MySQL5.7的安装步骤 解压 将my.ini文件拷贝到解压的目录下 更改my.ini文件&#xff0c;将安装目录替换&#xff0c;并将\改成\\ 在bin目录下进入cmd 执行安装&#xff1a; mysqld install 失败可能是应为没有用管理员身份执行cmd&#xff0c;要在开始菜单进入cmd &#xff…

【致远FAQ】V8.0sp1_门户设置——页面组件中设置列表头的颜色

问题描述 门户设置——页面组件中设置列表头的颜色后&#xff0c;底表数据查看时的列表头颜色没有变呢 解决办法 设置不对cap4生效&#xff0c;只针对原始oa的列表支持&#xff08;比如协同工作——已办事项、公文等列表项&#xff09; 设置参考

深度学习|2.4 梯度下降

如上图&#xff0c; J ( w , b ) J(w,b) J(w,b)是由w和b两个参数共同控制的损失函数&#xff0c;损失是不好的东西&#xff0c;所以应该求取合适的w和b使得损失最小化。 为了简单考虑&#xff0c;可以先忽略参数b。 斜率可以理解成在朝着x正方向移动单位距离所形成的损失值的变…

解读 $mash 通证 “Fair Launch” 规则,将公平发挥极致

Solmash 是 Solana 生态中由社区主导的铭文资产 LaunchPad 平台&#xff0c;该平台旨在为 Solana 原生铭文项目&#xff0c;以及通过其合作伙伴 SoBit 跨链桥桥接到 Solana 的 Bitcoin 生态铭文项目提供更广泛的启动机会。有了 Solmash&#xff0c;将会有更多的 Solana 生态的铭…

如何跨系统构建docker镜像?

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 1. 前言 docker镜像有基于amd64系统的&#xff0c;也有基于arm64系统的。 前段时间用了一个在x86_64的centos7服务器上构建的i…

NSSCTF sql

开启环境: ?wllm1 回显正常,试试?wllm1 出现报错;加上%23正常 ?wllm-1or 11%23出现过滤 测试,空格用**替代, 等号用like替代 测试长度 ?wlmm1order/**/by/**/3%23正常 ?wlmm1order/**/by/**/4%23报错 长度为3,测试回显位置: ?wlmm-1union/**/select/**/1,2,3%23 …

快速入门ESP32——点亮你的第一个LCD屏幕

相关文章 快速入门ESP32——开发环境配置Arduino IDE 快速入门ESP32——开发环境配置PlatformIO IDE 快速入门ESP32—— platformIO添加开源库和自己的开发库 快速入门ESP32—— 解决platformIO添加开源库下载失败的问题 快速入门ESP32——点亮你的第一个LCD屏幕 前言一、移植T…

B01、运行时数据区概述-03

1、什么是内存 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。 2、线程共享和…

利用MATLAB绘制折线图

x20:20:140;%x轴上的数据&#xff0c;第一个值代表数据开始&#xff0c;第二个值代表间隔&#xff0c;第三个值代表终止a[0.85, 2.2, 3.45, 2.65, 1.5, 1.9, 1.25]; %a数据y值plot(x,a,-*b); %线性&#xff0c;颜色&#xff0c;标记 axis([0,160,0,4]) %确定x轴与y轴框图大小 …

WIN10自带查看硬盘运行时间的指令

#创作灵感# 之前一直在捣腾电脑&#xff0c;最近又搞了个R720XD&#xff08;后续会有分享&#xff09;&#xff0c;所以对硬盘比较关注&#xff0c;查了一下硬盘方面的一些坑&#xff0c;机械硬盘最关注的问题就是运行时间了。 #正文# 查看硬盘运行时间需要用到Get-Disk指令&a…

电脑提示找不到msvcp140.dll的修复方法,亲测有效的两种方法

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一个组件&#xff0c;它包含了许多C运行时库文件。这些库文件为运行基于C编写的应用程序提供了必要的支持。当系统中缺少某个或某些库文件时&#xff0c;就可能出现msvcp140.dll丢失的错误。 一、以下是msvcp140.dll文…