gRPC用于Rust:库与使用示例

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

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

开始课程

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 {

推荐