1. gRPC 概述
1.1 gRPC 是什么
gRPC 是由 Google 开源的高性能、跨语言的远程过程调用(RPC)框架。它基于 HTTP/2 协议传输,使用 Protocol Buffers(protobuf)作为接口定义语言(IDL)和序列化工具。gRPC 允许客户端像调用本地函数一样直接调用另一台机器上的服务端方法,屏蔽了网络通信、序列化、反序列化等底层细节。
核心定位:gRPC 不是简单的 HTTP API 封装,而是一套完整的契约驱动通信体系。服务端与客户端必须严格遵循同一份
.proto 文件定义的接口和数据格式,实现强类型、双向校验的远程调用。
1.2 gRPC 的核心特性
gRPC 区别于传统 RPC 和 REST 的关键特性,使其成为微服务、移动端、物联网等场景的首选通信方案。
| 特性 | 说明 | 优势 |
|---|---|---|
| 基于 HTTP/2 | 多路复用、双向流、头部压缩、服务端推送 | 低延迟、高吞吐、节省带宽 |
| Protocol Buffers | 强类型 IDL + 高效二进制序列化 | 跨语言契约、体积小、解析快 |
| 四种通信模式 | 一元、服务端流、客户端流、双向流 | 灵活适配实时/批量/流式场景 |
| 自动代码生成 | 通过 protoc 编译器生成客户端 Stub 和服务端骨架 | 消除手写网络代码,减少错误 |
| 内置认证与安全 | 支持 TLS/SSL、Token 认证、拦截器扩展 | 开箱即用的安全通信 |
| 负载均衡与健康检查 | 集成 gRPC LB 策略、健康探测协议 | 生产级高可用保障 |
Go 语言生态优势:gRPC 官方对 Go 支持最完善,
google.golang.org/grpc 包提供了完整的客户端/服务端实现、拦截器、负载均衡、健康检查等组件,是 Go 微服务架构的事实标准通信层。
1.3 gRPC 与 REST 的对比
REST 是目前最广泛的 HTTP API 风格,gRPC 在性能、契约、流式通信等方面有明显差异。下表从多个维度进行对比:
| 对比维度 | gRPC | REST |
|---|---|---|
| 协议 | HTTP/2 | HTTP/1.1(主流),部分支持 HTTP/2 |
| 数据格式 | Protocol Buffers(二进制) | JSON / XML(文本) |
| 接口定义 | 强类型 .proto 契约文件 | 无强制契约,通常用 OpenAPI 文档 |
| 通信模式 | 一元、服务端流、客户端流、双向流 | 请求-响应(一元),SSE 可模拟服务端流 |
| 性能 | 高(二进制 + 多路复用 + 头部压缩) | 中(文本 + 串行请求) |
| 浏览器支持 | 需 gRPC-Web 代理 | 原生支持 |
| 工具生态 | protoc、grpcurl、grpcui | curl、Postman、Swagger UI |
| 适用场景 | 微服务内部、移动端、IoT、实时流 | 公开 API、Web 前端、简单 CRUD |
选择建议:如果系统需要对外暴露给浏览器或第三方开发者,REST 仍是更通用的选择;如果系统是内部微服务间通信,或需要低延迟、流式处理、强契约保障,gRPC 优势明显。实际项目中常采用 gRPC 内部 + REST 网关对外的混合架构。
1.4 gRPC 的适用场景
gRPC 并非万能银弹,它在以下场景中能发挥最大价值:
- 微服务间通信:服务数量多、调用频繁,gRPC 的低延迟和高吞吐能显著降低内部网络开销。
- 移动端与后端通信:二进制序列化体积小,节省移动端带宽和电量;HTTP/2 多路复用减少连接数。
- 实时流式处理:双向流模式适合聊天、游戏同步、金融行情推送、日志收集等场景。
- 多语言异构系统:同一份 .proto 文件可生成 Go、Java、Python、C++ 等十余种语言的代码,保证跨语言一致性。
- 物联网(IoT)与边缘计算:设备端资源受限,gRPC 的轻量级序列化和双向流适合设备数据上报与指令下发。
- 高性能计算与数据管道:大数据传输、模型推理、实时特征工程等场景需要高效的数据交换。