在现代微服务架构中,gRPC 因其高性能、跨语言支持和基于 HTTP/2 的特性而广受欢迎。如果你正在使用 Rust 编写后端服务,那么 tonic 是一个非常优秀的 gRPC 框架选择。本文将带你从零开始,使用 tonic gRPC 库 构建一个简单的 gRPC 服务与客户端,即使是 Rust 初学者也能轻松上手。

tonic 是一个用 Rust 编写的原生异步 gRPC 框架,构建在 tokio 和 hyper 之上。它充分利用了 Rust 的零成本抽象和内存安全特性,同时提供了简洁的 API 来定义和调用 gRPC 服务。
在本教程中,我们将学习如何:
prost 和 tonic-build 生成 Rust 代码首先,使用 Cargo 创建一个新的二进制项目:
cargo new rust-tonic-democd rust-tonic-demo然后,在 Cargo.toml 中添加以下依赖:
[dependencies]tonic = "0.10"prost = "0.12"tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] }tonic-build = "0.10"在项目根目录下创建一个 proto 文件夹,并在其中创建 hello.proto 文件:
syntax = "proto3";package hello;service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}message HelloRequest { string name = 1;}message HelloReply { string message = 1;}这个文件定义了一个名为 Greeter 的服务,包含一个 SayHello 方法,接收一个包含名字的请求,返回一条问候消息。
在 build.rs 文件中(如果没有则创建),添加以下内容:
fn main() { tonic_build::compile_protos("proto/hello.proto").unwrap();}运行 cargo build 后,tonic-build 会自动生成 Rust 代码到 OUT_DIR,我们可以在 src/main.rs 中通过 include!(concat!(env!("OUT_DIR"), "/hello.rs")); 引入。
修改 src/main.rs 如下:
// 引入生成的代码include!(concat!(env!("OUT_DIR"), "/hello.rs"));use hello::greeter_server::{Greeter, GreeterServer};use hello::{HelloRequest, HelloReply};use tonic::{transport::Server, Request, Response, Status};#[derive(Debug, 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!("Hello, {}!", name), }; Ok(Response::new(reply)) }}#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { let addr = "[::1]:50051".parse().unwrap(); let greeter = MyGreeter::default(); println!("Starting gRPC server on {}", addr); Server::builder() .add_service(GreeterServer::new(greeter)) .serve(addr) .await?; Ok(())}为了测试服务,我们可以将客户端逻辑也写在同一个文件中(或新建一个二进制目标)。这里我们简单地在 main 函数中添加条件判断:
// 在 main.rs 顶部添加use std::env;// 修改 main 函数#[tokio::main]async fn main() -> Result<(), Box<dyn std::error::Error>> { let args: Vec<String> = env::args().collect(); if args.len() > 1 && args[1] == "client" { // 客户端逻辑 let mut client = hello::greeter_client::GreeterClient::connect("http://[::1]:50051").await?; let request = tonic::Request::new(HelloRequest { name: "Tonic User".into(), }); let response = client.say_hello(request).await?; println!("Response: {}", response.into_inner().message); } else { // 服务端逻辑 let addr = "[::1]:50051".parse().unwrap(); let greeter = MyGreeter::default(); println!("Starting gRPC server on {}", addr); Server::builder() .add_service(GreeterServer::new(greeter)) .serve(addr) .await?; } Ok(())}打开两个终端窗口:
终端1(启动服务):
cargo run终端2(运行客户端):
cargo run -- client你应该会在客户端看到输出:Response: Hello, Tonic User!
通过本教程,你已经学会了如何使用 Rust gRPC教程 中的核心工具——tonic 框架来构建一个完整的 gRPC 服务。无论是用于 Rust微服务通信 还是高性能 API 设计,tonic 都是一个强大且类型安全的选择。
掌握 tonic gRPC框架 不仅能提升你的 Rust 工程能力,还能为构建现代化分布式系统打下坚实基础。希望这篇 gRPC入门指南 能帮助你顺利开启 Rust + gRPC 的开发之旅!
如需进一步学习,建议查阅 tonic 官方文档 和 GitHub 示例仓库。
本文由主机测评网于2025-12-06发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025123801.html