RPC 与服务通信
微服务间通信分为同步 RPC 和异步消息两种模式。
通信模式选择
服务 A → 服务 B
同步 RPC:
需要立即得到结果(下单→扣库存确认)
→ REST / gRPC
异步消息:
不需要立即结果(下单→发送邮件)
→ Kafka / RocketMQ / RabbitMQ
gRPC
Google 开源的高性能 RPC 框架,基于 HTTP/2 + Protobuf。
为什么快
| 特性 | 说明 |
|---|---|
| HTTP/2 | 多路复用,一条连接并发多个请求 |
| Protobuf | 二进制序列化,体积比 JSON 小 3~10 倍 |
| 长连接 | 复用连接,减少握手开销 |
| Header 压缩 | HTTP/2 HPACK 压缩头部 |
| 流式通信 | 支持客户端流、服务端流、双向流 |
通信模式
service OrderService {
// 普通 RPC
rpc CreateOrder (OrderRequest) returns (OrderResponse);
// 服务端流式:一个请求,多个响应(如实时推送)
rpc WatchOrder (OrderRequest) returns (stream OrderEvent);
// 客户端流式:多个请求,一个响应(如批量上传)
rpc BatchCreate (stream OrderRequest) returns (BatchResponse);
// 双向流式(如实时聊天)
rpc Chat (stream Message) returns (stream Message);
}调用链路
客户端
│
▼
Protobuf 序列化
│
▼
HTTP/2 传输
│
▼
服务端 Protobuf 反序列化
│
▼
业务逻辑处理
│
▼
返回(同样经过序列化 + HTTP/2)
gRPC vs REST
| 维度 | gRPC | REST |
|---|---|---|
| 协议 | HTTP/2 | HTTP/1.1 |
| 序列化 | Protobuf(二进制) | JSON(文本) |
| 性能 | 高 | 中 |
| 流式 | 支持 | 不支持(需 WebSocket) |
| 可读性 | 差(二进制) | 好(JSON) |
| 浏览器支持 | 差(需 grpc-web) | 好 |
| 场景 | 服务间内部通信 | 对外 API |
主流 RPC 框架
| 框架 | 语言 | 特点 |
|---|---|---|
| gRPC | 多语言 | 性能强,云原生首选 |
| Dubbo | Java | 阿里生态,服务治理完善 |
| Thrift | 多语言 | Facebook,轻量 |
| Motan | Java | 微博,简单易用 |
| SOFARPC | Java | 蚂蚁金服,高性能 |
多语言微服务通信
现代云原生团队通常多语言混用,gRPC 是跨语言通信的标准:
Java 服务(核心业务)
│
gRPC
│
Python 服务(AI / 数据处理)
│
gRPC
│
Go 服务(云原生组件 / 高性能网关)
│
gRPC
│
Rust 服务(极致性能场景)
服务间通信安全
生产环境服务间通信建议:
- Service Mesh mTLS:Istio 自动为所有服务间通信加密,无需代码改动
- gRPC TLS:在 gRPC 层配置证书
- Zero Trust:默认不信任任何内部流量,每次通信都验证身份
同步 vs 异步选择原则
| 场景 | 推荐方式 |
|---|---|
| 需要立即得到结果 | gRPC / REST |
| 不需要立即结果,对延迟不敏感 | 消息队列 |
| 一对多广播 | 消息队列(Topic) |
| 削峰填谷 | 消息队列 |
| 跨语言数据交换 | gRPC + Protobuf |
| 对外暴露 API | REST / GraphQL |