rust grpc demo

ops/2024/10/24 8:41:58/

文章目录

    • 1. 创建项目
    • 2. 配置proto
      • 2.1 配置Cargo.toml, 内容如下:
      • 2.2 创建文件proto/hello.proto, 内容如下:
      • 2.3 添加build.rs文件, 内容如下:
      • 2.4 项目结构如下:
      • 2.5 编译proto文件
    • 3.0 处理服务
      • 3.1 项目引入
      • 3.2 添加src/server.rs, 内容如下:
      • 3.3 添加src/client.rs, 内容如下:
    • 5 运行服务
      • 5.1 修改Cargo.toml, 添加运行bin配置, 内容如下:
      • 5.2 运行server
      • 5.3 运行client, 测试

1. 创建项目

cargo new --lib grpc-demo

2. 配置proto

进入项目grpc-demo

2.1 配置Cargo.toml, 内容如下:

[package]
name = "grpc-demo"
version = "0.1.0"
edition = "2021"[dependencies]
tonic = "0.12.3"
tokio = { version = "1.37.0", features = ["macros", "rt-multi-thread", "full"] }
prost = "0.13.3"[build-dependencies]
tonic-build = "0.11.0"

2.2 创建文件proto/hello.proto, 内容如下:

syntax = "proto3";package hello;service Hello {rpc Hello(HelloRequest) returns (HelloResponse) {}
}message HelloRequest {string name = 1;
}message HelloResponse {string data = 1;string message = 2;int32 code = 3;
}

2.3 添加build.rs文件, 内容如下:

rust">use std::error::Error;fn main() -> Result<(), Box<dyn Error>> {let protos = ["proto/hello.proto",];tonic_build::configure().compile(&protos, &["proto/"])?;Ok(())
}

2.4 项目结构如下:

在这里插入图片描述

2.5 编译proto文件

cargo build

3.0 处理服务

3.1 项目引入

编辑src/lib.rs, 内容如下:

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

3.2 添加src/server.rs, 内容如下:

HelloService 是实现hello的service

rust">use tonic::{Request, Response, Status};
use tonic::transport::Server;
use grpc_demo::hello::{HelloRequest, HelloResponse};
use grpc_demo::hello::hello_server::{Hello, HelloServer};#[derive(Default)]
pub struct HelloService {}#[tonic::async_trait]
impl Hello for HelloService {async fn hello(&self, req: Request<HelloRequest>) -> Result<Response<HelloResponse>, Status> {println!("hello receive request: {:?}", req);let response = HelloResponse {data: format!("Hello, {}", req.into_inner().name),message: "Ok".to_string(),code: 200,};Ok(Response::new(response))}
}#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {let addr = "0.0.0.0:50051".parse()?;println!("server starting at: {}", addr);Server::builder().add_service(HelloServer::new(HelloService::default())).serve(addr).await?;Ok(())
}

3.3 添加src/client.rs, 内容如下:

HelloService 是实现hello的service

rust">use tonic::Request;
use tonic::transport::Endpoint;
use grpc_demo::hello::hello_client::HelloClient;
use grpc_demo::hello::HelloRequest;#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {let addr = Endpoint::from_static("https://127.0.0.1:50051");let mut hello_cli = HelloClient::connect(addr.clone()).await?;let request = Request::new(HelloRequest {name: "tonic".to_string(),});let response = hello_cli.hello(request).await?;println!("hello response: {:?}", response.into_inner());Ok(())
}

5 运行服务

5.1 修改Cargo.toml, 添加运行bin配置, 内容如下:

[package]
name = "grpc-demo"
version = "0.1.0"
edition = "2021"[[bin]]
name="server"
path="src/server.rs"[[bin]]
name="client"
path="src/client.rs"[dependencies]
tonic = "0.12.3"
tokio = { version = "1.37.0", features = ["macros", "rt-multi-thread", "full"] }
prost = "0.13.3"[build-dependencies]
tonic-build = "0.11.0"

5.2 运行server

cargo run --bin server

结果如下:
在这里插入图片描述

5.3 运行client, 测试

重新打开一个命令行, 进入项目根目录, 然后执行:

cargo run --bin client

结果如下:
在这里插入图片描述


http://www.ppmy.cn/ops/128045.html

相关文章

学习记录:js算法(七十三):跳跃游戏

文章目录 跳跃游戏思路一&#xff1a;贪心算法思路二&#xff1a;动态规划思路三&#xff1a;递归 记忆化搜索思路四&#xff1a;广度优先搜索 (BFS)思路五&#xff1a;深度优先搜索 (DFS) 跳跃游戏 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个 下标 。数…

我开源了Go语言连接数据库和一键生成结构体的包【实用】

项目地址&#xff1a;https://gitee.com/zht639/my_gopkg autosql autosql 是一个简化数据库使用的模块&#xff0c;支持常见的数据库&#xff08;MySQL、PostgreSQL、SQLite、SQL Server&#xff09;。该模块不仅提供了数据库连接函数&#xff0c;还能自动生成数据表对应的结…

如何解决 PyQt5 中使用 QtNetwork后使用pyinstaller 打包后网络请求失败的问题

在使用 PyQt5 开发应用程序时&#xff0c;我遇到一个问题&#xff1a;使用 QtNetwork 进行网络通信&#xff0c;在通过 PyInstaller 打包后&#xff0c;应用程序无法正常进行网络请求。经过一些研究和尝试&#xff0c;我找到了解决方案&#xff0c;并记录如下&#xff1a; 问题…

图文深入介绍oracle资源管理(续)

1. 引言&#xff1a; 本文将承接上篇继续深入介绍oracle资源管理。本文重点介绍如何使用oracle资源管理器管理好DB。 2. 资源管理器&#xff1a; 可以使用图形界面 OEM$或命令行调用 DBMS RESOURCE MANAGER 程序包的过程进行数据库资源管理。 调用资源管理器的先决条件&…

Linux中如何理解一切皆文件

根据之前的学习我们会有一些少许的疑惑&#xff0c;我们的stdin &#xff0c;stdout&#xff0c;stderr访问的是键盘显示器&#xff0c;然而键盘显示器等他们都有一个共同的特点就是他们都是外设&#xff0c;那么这些外设是怎么被看成是文件的呢&#xff1f; 看图可以知道硬件的…

TCP 协议学习

一、引言 在当今的网络通信世界中&#xff0c;TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是最为重要的协议之一。它为各种网络应用提供了可靠的、有序的数据传输服务&#xff0c;是互联网通信的基石。无论是网页浏览、电子邮件发送、…

万户ezEIP企业管理系统 productlist.aspx SQL注入漏洞复现

0x01 产品描述&#xff1a; 万户协同办公平台 ezEIP 是一个综合信息基础应用平台。系统完善的用户、权限、角色、对象多层分离权限管理体系&#xff0c;实现分站点、分栏目、分对象的分权管理体系&#xff0c;将站点维护工作分担到各职能部门各岗位。系统管理员负责系统基础设置…

【使用Flask构建RESTful API】从零开始开发简单的Web服务!

使用Flask构建RESTful API&#xff1a;从零开始开发简单的Web服务 引言 随着Web应用程序的广泛使用&#xff0c;RESTful API已成为现代Web服务的核心技术之一。通过RESTful API&#xff0c;我们可以轻松地创建、读取、更新和删除&#xff08;CRUD&#xff09;数据&#xff0c…