1. gRPC 基础概念
gRPC 是 Google 开源的高性能远程过程调用(RPC)框架,基于 HTTP/2 协议传输,使用 Protocol Buffers 作为接口定义语言(IDL)和序列化工具。在微服务架构中,gRPC 已成为服务间通信的首选方案之一,尤其适合需要低延迟、强类型契约和高吞吐量的场景。
1.1 gRPC 是什么
gRPC 的核心思想是:客户端像调用本地函数一样调用远程服务。开发者只需在 .proto 文件中定义服务接口和消息结构,gRPC 即可自动生成客户端和服务端代码,屏蔽网络通信、序列化、反序列化等底层细节。
核心特性:
- 基于 HTTP/2:支持多路复用、流控、头部压缩,降低延迟。
- Protocol Buffers 序列化:二进制格式,体积小、解析快。
- 双向流:支持四种服务模式,灵活应对不同通信场景。
- 多语言支持:自动生成 C++、Go、Java、Python 等语言的客户端/服务端代码。
1.2 gRPC 与 REST 对比
REST 是资源导向的架构风格,gRPC 是动作导向的 RPC 框架。两者在协议、性能、开发体验上有显著差异:
| 对比维度 | gRPC | REST |
|---|---|---|
| 底层协议 | HTTP/2 | HTTP/1.1(主流) |
| 数据格式 | Protocol Buffers(二进制) | JSON / XML(文本) |
| 接口定义 | 强契约(.proto 文件) | 弱契约(文档约定) |
| 流式通信 | 原生支持(双向流) | 需额外实现(SSE / WebSocket) |
| 浏览器支持 | 需 gRPC-Web 代理 | 原生支持 |
| 性能 | 高(二进制 + 多路复用) | 中(文本 + 串行请求) |
| 工具生态 | protoc 编译器、反射、拦截器 | Swagger、Postman、curl |
选型建议:内部微服务通信优先选择 gRPC;对外公开 API 或需要浏览器直接访问时,REST 仍是更通用的选择。实践中常采用“gRPC 对内 + REST 对外”的混合架构。
1.3 Protocol Buffers 简介
Protocol Buffers(简称 protobuf)是 Google 的语言中立、平台中立的序列化结构数据格式。开发者通过 .proto 文件定义数据结构,然后使用 protoc 编译器生成目标语言的代码。
一个典型的 .proto 文件示例:
syntax = "proto3";
package order;
service OrderService {
rpc CreateOrder (CreateOrderRequest) returns (CreateOrderResponse);
}
message CreateOrderRequest {
string user_id = 1;
repeated string item_ids = 2;
double total_amount = 3;
}
message CreateOrderResponse {
string order_id = 1;
int32 status_code = 2;
string message = 3;
}
protobuf 相比 JSON 的核心优势:
- 体积小:二进制编码,无冗余字段名,体积约为 JSON 的 1/3 到 1/10。
- 解析快:无需字符串解析,直接映射到内存结构。
- 强类型:编译期检查字段类型和结构,避免运行时数据不一致。
- 向后兼容:字段编号机制支持新增/废弃字段而不破坏现有服务。
1.4 gRPC 的四种服务模式
gRPC 基于 HTTP/2 的流式能力,定义了四种服务模式,覆盖从简单请求-响应到复杂流式交互的全部场景:
四种模式在 .proto 文件中的定义方式:
// 一元 RPC
rpc GetUser(GetUserRequest) returns (GetUserResponse);
// 服务端流 RPC
rpc ListUsers(ListUsersRequest) returns (stream User);
// 客户端流 RPC
rpc UploadLogs(stream LogEntry) returns (UploadResponse);
// 双向流 RPC
rpc Chat(stream ChatMessage) returns (stream ChatMessage);
模式选择要点:
- 一元 RPC 适合查询、创建等原子操作,是默认首选。
- 服务端流适合“一次请求,多次推送”的场景,如订阅通知。
- 客户端流适合“多次上传,一次确认”的场景,如批量导入。
- 双向流适合“双方持续交互”的场景,如实时协作。
- 流式模式依赖 HTTP/2 的长连接,需注意连接管理和背压控制。
1.5 本章小结
gRPC 通过 HTTP/2 + Protocol Buffers 的组合,提供了比 REST 更高效的通信方式。四种服务模式覆盖了从简单请求到复杂流式交互的全部场景。理解这些基础概念,是后续学习事务边界设计和契约设计的前提。