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