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

维度gRPCREST
协议HTTP/2HTTP/1.1
序列化Protobuf(二进制)JSON(文本)
性能
流式支持不支持(需 WebSocket)
可读性差(二进制)好(JSON)
浏览器支持差(需 grpc-web)
场景服务间内部通信对外 API

主流 RPC 框架

框架语言特点
gRPC多语言性能强,云原生首选
DubboJava阿里生态,服务治理完善
Thrift多语言Facebook,轻量
MotanJava微博,简单易用
SOFARPCJava蚂蚁金服,高性能

多语言微服务通信

现代云原生团队通常多语言混用,gRPC 是跨语言通信的标准:

Java 服务(核心业务)
      │
   gRPC
      │
Python 服务(AI / 数据处理)
      │
   gRPC
      │
Go 服务(云原生组件 / 高性能网关)
      │
   gRPC
      │
Rust 服务(极致性能场景)

服务间通信安全

生产环境服务间通信建议:

  1. Service Mesh mTLS:Istio 自动为所有服务间通信加密,无需代码改动
  2. gRPC TLS:在 gRPC 层配置证书
  3. Zero Trust:默认不信任任何内部流量,每次通信都验证身份

同步 vs 异步选择原则

场景推荐方式
需要立即得到结果gRPC / REST
不需要立即结果,对延迟不敏感消息队列
一对多广播消息队列(Topic)
削峰填谷消息队列
跨语言数据交换gRPC + Protobuf
对外暴露 APIREST / GraphQL