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 流模式中用于推送数据
流优先级 可设置流的依赖与权重 支持服务质量控制
gRPC 协议栈分层结构 应用层:业务逻辑 / gRPC 服务接口 序列化层:Protocol Buffers(protobuf) gRPC 核心层:流控制 / 认证 / 拦截器 / 负载均衡 传输层:HTTP/2(二进制分帧 / 多路复用 / 头部压缩)

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):双方独立发送流,实时交互。适用于聊天、实时协同。
gRPC 四种通信模式 一元调用 请求 → 响应 类似 REST 服务端流 请求 → 流响应 日志/监控 客户端流 流请求 → 响应 批量上传 双向流 流请求 ↔ 流响应 实时聊天 所有模式均基于 HTTP/2 流,支持取消、超时、元数据传递

3.6 本章小结