gRPC для Rust: 库与示例
gRPC 是由 Google 开发的高性能远程过程调用(RPC)框架。它使用 Protocol Buffers(protobuf)进行数据序列化,并通过 HTTP/2 进行传输。在 Rust 生态系统中,用于处理 gRPC 的主要库是 tonic 和 grpc-rs。本文将详细介绍这两个库、它们的功能,并提供实用的代码示例。
为什么在 Rust 中使用 gRPC?
Rust 是一种注重内存安全和性能的系统编程语言。Rust 中的 gRPC 可用于构建:
- 高负载微服务
- 实时流式服务
- 跨平台客户端-服务器应用程序
- 与现有 gRPC 基础设施的集成
主要库
1. Tonic — 现代且推荐的方案
Tonic 是一个基于 tokio 和 hyper 构建的异步 gRPC 库。它得到社区的积极维护,被认为是 Rust 中 gRPC 的标准选择。
Tonic 的优点:
- 完全支持 gRPC(一元、服务端、客户端和双向流)
- 通过
tonic-build基于.proto文件生成代码 - 与
tokio(异步运行时)集成 - 支持 TLS、负载均衡和拦截器
- 活跃的社区和良好的文档
2. grpc-rs — PingCAP 的替代方案
grpc-rs 是一个基于 C 库 gRPC Core 的 Rust 封装。用于 TiKV 项目。适用于需要与原始 gRPC C 栈最大兼容性的场景。
grpc-rs 的特点:
- 封装了 gRPC Core(C 库)
- 支持所有类型的 gRPC 调用
- 更少“魔法”——更多控制
- 需要安装
protoc和cmake - 相较于 tonic 流行度较低
建议:对于大多数新项目,请选择 tonic。如果您需要与现有 gRPC C 代码集成,则应使用 grpc-rs。
使用 tonic 配置项目
创建一个新项目:
cargo new grpc-examplecd grpc-example在 Cargo.toml 中添加依赖项:
[dependencies]tonic = "0.11"prost = "0.12"tokio = { version = "1", features = ["full"] }
[build-dependencies]tonic-build = "0.11"创建文件 proto/hello.proto:
syntax = "proto3";
package hello;
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}
message HelloRequest { string name = 1;}
message HelloReply { string message = 1;}配置构建——创建 build.rs:
fn main() -> Result<(), Box<dyn std::error::Error>> { tonic_build::compile_protos("proto/hello.proto")?; Ok(())}使用 tonic 构建服务端示例
创建 src/server.rs:
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 {