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 的流式能力,定义了四种服务模式,覆盖从简单请求-响应到复杂流式交互的全部场景:

gRPC 四种服务模式 一元 RPC (Unary) 客户端发送单个请求 服务端返回单个响应 类似传统函数调用 最常用模式 服务端流 RPC 客户端发送单个请求 服务端返回多个响应流 适用:大文件下载 实时数据推送 客户端流 RPC 客户端发送多个请求流 服务端返回单个响应 适用:批量数据上传 日志聚合 双向流 RPC 客户端和服务端 独立发送多个流 适用:实时聊天 游戏状态同步 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 更高效的通信方式。四种服务模式覆盖了从简单请求到复杂流式交互的全部场景。理解这些基础概念,是后续学习事务边界设计和契约设计的前提。