3. gRPC 简介与核心概念
gRPC 是 Google 开源的高性能远程过程调用框架,基于 HTTP/2 协议传输,使用 Protocol Buffers 作为接口定义语言与序列化工具。它支持双向流、流控、头部压缩等特性,是微服务架构中服务间通信的主流选择之一。
3.1 gRPC 定义
gRPC 的全称是 gRPC Remote Procedure Calls。它允许客户端像调用本地函数一样调用远程服务,屏蔽了网络传输、序列化、连接管理等底层细节。gRPC 的核心设计理念包括:
- 基于 Protobuf 的接口契约:服务接口与消息结构通过
.proto文件定义,生成多语言客户端与服务端桩代码。 - HTTP/2 传输层:利用多路复用、服务器推送、二进制分帧等特性提升性能。
- 四种通信模式:一元调用、服务端流、客户端流、双向流。
- 内置认证、负载均衡、健康检查:生态组件完善,适合生产环境。
关键点:gRPC 默认使用 Protobuf 序列化,数据体积比 JSON 小 3~10 倍,解析速度更快,适合高吞吐、低延迟场景。
3.2 Protocol Buffers(protobuf)
Protocol Buffers 是 Google 开发的与语言无关、平台无关的序列化结构化数据格式。它通过 .proto 文件定义消息类型和服务接口,然后使用 protoc 编译器生成目标语言的代码。
3.2.1 消息定义示例
syntax = "proto3";
package order.v1;
message OrderRequest {
string order_id = 1;
int32 user_id = 2;
repeated string item_ids = 3;
double total_amount = 4;
}
message OrderResponse {
string order_id = 1;
string status = 2;
int64 created_at = 3;
}
3.2.2 服务定义示例
service OrderService {
rpc CreateOrder (OrderRequest) returns (OrderResponse);
rpc GetOrderStatus (OrderRequest) returns (OrderResponse);
rpc StreamOrderUpdates (OrderRequest) returns (stream OrderResponse);
}
字段编号规则:1~15 号字段使用 1 字节编码,适合频繁出现的字段;16~2047 号字段使用 2 字节编码。预留编号应避免冲突。
3.3 HTTP/2 协议基础
HTTP/2 是 gRPC 的底层传输协议,相比 HTTP/1.1 在性能上有显著提升。以下是 HTTP/2 的核心特性:
| 特性 | 说明 | 对 gRPC 的价值 |
|---|---|---|
| 二进制分帧 | 将请求/响应拆分为帧(HEADERS、DATA、RST_STREAM 等) | 支持多路复用,减少连接数 |
| 多路复用 | 一个 TCP 连接可并发处理多个流 | 避免队头阻塞,提升并发性能 |
| 头部压缩 | 使用 HPACK 算法压缩 HTTP 头部 | 减少重复头部开销,适合高频调用 |
| 服务器推送 | 服务器可主动推送资源 | gRPC 流模式中用于推送数据 |
| 流优先级 | 可设置流的依赖与权重 | 支持服务质量控制 |
3.4 gRPC vs REST 对比
REST 是当前最广泛的 API 设计风格,gRPC 在微服务内部通信场景中逐渐成为替代方案。以下从多个维度进行对比:
| 对比维度 | gRPC | REST |
|---|---|---|
| 协议 | HTTP/2(二进制) | HTTP/1.1 或 HTTP/2(文本为主) |
| 数据格式 | Protocol Buffers(二进制) | JSON / XML(文本) |
| 接口定义 | .proto 文件(强类型契约) |
OpenAPI / Swagger(文档驱动) |
| 通信模式 | 一元、服务端流、客户端流、双向流 | 请求-响应(支持 SSE 流) |
| 浏览器支持 | 需 gRPC-Web 代理 | 原生支持 |
| 性能 | 高(低延迟、高吞吐) | 中等(文本解析开销) |
| 工具生态 | protoc、grpcurl、BloomRPC | Postman、curl、Swagger UI |
| 适用场景 | 微服务内部通信、实时流、IoT | 外部 API、Web 应用、开放接口 |
选型建议:如果服务间需要高频、低延迟、流式通信,优先选择 gRPC;如果 API 需要被浏览器、移动端或第三方广泛调用,REST 更通用。实践中常采用混合架构:内部服务用 gRPC,对外暴露 REST/GraphQL。
3.5 gRPC 通信模式概览
gRPC 支持四种通信模式,适应不同的业务场景:
- 一元调用(Unary):客户端发送一个请求,服务端返回一个响应。类似 REST 的 POST/GET。
- 服务端流(Server Streaming):客户端发送一个请求,服务端返回多个响应流。适用于日志推送、监控数据。
- 客户端流(Client Streaming):客户端发送多个请求流,服务端返回一个响应。适用于批量上传、数据聚合。
- 双向流(Bidirectional Streaming):双方独立发送流,实时交互。适用于聊天、实时协同。