gRPC是C++微服务中基于Protocol Buffers和HTTP/2的高性能RPC框架。1. 用.proto定义服务与消息;2. protoc生成C++桩代码并链接gRPC库;3. 异步服务端基于CompletionQueue;4. 客户端按需选同步或异步调用;5. 通过禁用Nagle、调优HTTP/2参数、复用Channel等实现性能优化。

gRPC 是 C++ 微服务中实现高性能 RPC 的主流选择,核心在于基于 Protocol Buffers 的接口定义 + 异步/同步客户端-服务端通信。它默认使用 HTTP/2,支持多路复用、流控和头部压缩,天然适合低延迟、高吞吐的微服务交互。
1. 定义服务接口(.proto 文件)
所有 gRPC 通信始于一个清晰的接口契约。用 .proto 文件描述服务方法、请求响应结构和数据类型:
- 使用
service块声明 RPC 方法(支持 unary、server streaming、client streaming、bidi streaming) - 消息字段必须带编号,推荐使用
syntax = "proto3"; - 避免嵌套过深或重复定义,可引入其他 proto 文件(
import)
示例 helloworld.proto:
syntax = "proto3";
package helloworld;
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
service Greeter {
rpc SayHello(HelloRequest) returns (HelloReply);
}
2. 生成 C++ 代码并链接 gRPC 库
用 protoc 编译器配合 gRPC 插件生成客户端和服务端桩代码:
立即学习“C++免费学习笔记(深入)”;
- 安装 gRPC C++(推荐通过
cmake构建,或用 vcpkg/conan 管理依赖) - 执行命令:
protoc --grpc_out=. --cpp_out=. -I. helloworld.proto(需先设置PROTOC_GEN_GRPC_CPP) - 生成
helloworld.grpc.pb.h/.cc和helloworld.pb.h/.cc - CMake 中链接
gRPC::grpc++、gRPC::grpc++_reflection(可选)等 target
3. 实现服务端(异步模式更推荐)
高性能服务端应优先采用异步 API(AsyncGenericService 或基于 CompletionQueue 的自定义服务类),避免线程阻塞:
- 创建
ServerBuilder,添加监听地址、注册服务实例、设置最大并发数 - 每个 RPC 请求对应一个
ServerContext+CompletionQueue事件循环 - 用
RequestXXX启动异步等待,用Finish发送响应,全程无锁回调驱动 - 可结合线程池(如
ThreadPool)分发任务,但注意 completion queue 的线程安全边界
4. 编写客户端(同步/异步按需选)
同步客户端适合简单调用或测试;生产环境高频调用建议异步 + CompletionQueue:
- 构造
Channel(推荐grpc::CreateChannel(..., ...),支持负载均衡策略如 round_robin) - 同步调用:直接调用 stub 方法,返回
Status和响应对象 - 异步调用:调用
PrepareAsyncXXX+StartCall+Finish,通过 tag 关联上下文 - 启用健康检查、超时控制(
ClientContext::set_deadline)、TLS 认证(SslCredentials)提升健壮性
5. 性能调优关键点
真正发挥 gRPC 高性能,需关注底层配置与使用习惯:
- 禁用 Nagle 算法:
ChannelArguments args; args.SetInt(GRPC_ARG_TCP_NODELAY, 1); - 调整 HTTP/2 设置:增大
GRPC_ARG_MAX_CONCURRENT_STREAMS、合理设置初始窗口大小 - 复用 Channel 和 Stub 实例(Channel 是线程安全的,Stub 不是,但可多线程共用同一 Channel)
- 避免频繁构造/析构
ClientContext,可池化或复用 - 日志级别设为
ERROR或关闭,调试期再开INFO











