Rust中的gRPC:Tonic和Grpc-rs库及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Rust的gRPC:库与示例



gRPC是由Google开发的高性能远程过程调用(RPC)框架。它使用Protocol Buffers(protobuf)进行数据序列化,并采用HTTP/2作为传输协议。凭借强类型、双向流传输和低延迟等特性,gRPC已成为微服务架构的标准。在Rust生态系统中,有两个主要的gRPC库:Tonic和grpc-rs。本文将介绍它们的特点并提供实用示例。



1. Tonic——现代且异步

Tonic是Rust中最流行的gRPC库。它基于tokio和hyper构建,完全异步,并与Rust生态系统完美集成。Tonic支持所有四种gRPC调用类型:一元调用、服务端流式、客户端流式和双向流式。



安装与配置

在Cargo.toml中添加依赖:

[dependencies]tonic = "0.12"prost = "0.13"tokio = { version = "1", features = ["full"] }

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


定义protobuf服务

创建文件proto/hello.proto:

syntax = "proto3";

package hello;

service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}

message HelloRequest { string name = 1;}

message HelloReply { string message = 1;}


编译protobuf

在build.rs中指定:

fn main() -> Result<(), Box<dyn std::error::Error>> {    tonic_build::compile_protos("proto/hello.proto")?;    Ok(())}


实现服务端

基于Tonic的简单gRPC服务端示例:

use tonic::{transport::Server, Request, Response, Status};use hello::greeter_server::{Greeter, GreeterServer};use hello::{HelloRequest, HelloReply};

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

#[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 name = request.into_inner().name; let reply = HelloReply { message: format!("你好,{}!", name), }; Ok(Response::new(reply)) }}

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

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

Ok(())}


客户端

use hello::greeter_client::GreeterClient;use hello::HelloRequest;

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

#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { let mut client = GreeterClient::connect("http://[::1]:50051").await?;

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

let response = client.say_hello(request).await?; println!("服务端响应:{}", response.into_inner().message); Ok(())}


2. grpc-rs——成熟的替代方案

grpc-rs是TiKV团队开发的库,基于C库gRPC Core构建。它提供了与官方gRPC C框架的最大兼容性,但需要安装系统依赖(cmake、protobuf)。grpc-rs支持同步和异步调用,但在易用性上不如Tonic。



grpc-rs服务端示例

use grp                    

推荐