RPC 框架选型

RPC 框架选型看协议与序列化、语言支持、服务治理(注册发现、负载均衡、熔断)与生态:gRPC 跨语言强类型,Dubbo 等生态绑定语言栈与治理体系。

什么是 RPC 框架选型

RPC 框架决定了服务间调用的协议、序列化方式与治理能力。gRPC 基于 HTTP/2 与 Protocol Buffers,跨语言、强类型、支持流式调用;Dubbo 一类框架以私有协议为主,深度绑定 Java 生态并内置注册发现、路由与熔断。选型的实质是判断需要多少治理能力,以及团队要为此付出多少配置与运维成本。

基本信息

协议层HTTP/2、私有长连接协议或双协议并存
序列化Protobuf、Thrift、Hessian、JSON 等,影响性能与可调试性
治理能力注册发现、负载均衡、熔断限流、灰度路由
配套生态可观测接入、配置中心、多语言 SDK 成熟度

框架对照

维度gRPCDubbo 类框架
协议HTTP/2 加 Protobuf,跨语言友好私有协议为主,Java 生态绑定深
治理生态插件补充注册发现与重试内置注册发现、路由与熔断
契约接口定义文件生成多语言桩代码接口与实现约定,跨语言需额外适配
适用多语言、强类型契约、流式调用Java 技术栈内部的深度服务治理

典型使用场景

  • 内部服务调用:低延迟、高频次的同机房服务间通信
  • 跨语言协作:Java 调用 Go 或 Python 服务,用强类型契约减少联调成本
  • 流式数据传输:双向流用于推送、订阅与长任务进度上报
  • 存量治理升级:把散落的 HTTP 调用收敛到有注册发现与熔断的框架
  • 对外接口:需要浏览器或第三方调用时改走 REST 或网关,不直接暴露内部 RPC
  • 多环境联调:通过服务发现与路由规则按环境隔离流量

接口定义与调用片段

接口定义与调用片段
# protobuf 契约(示意)
service OrderService {
  rpc GetOrder (GetOrderRequest) returns (OrderReply);
}
message GetOrderRequest { string order_id = 1; }
# 生成桩代码后,服务端实现接口、客户端按契约调用,字段变更走兼容规则
# 注意:字段编号一旦发布不要复用,删除字段要标记 reserved
治理能力要匹配组织规模:小团队引入重型治理框架,注册中心、配置与运维的复杂度常常超过业务本身。
超时与重试在框架层的默认值要显式覆盖:默认重试会放大下游压力,非幂等接口上尤其危险。

易错点

  • 跨语言场景选了语言绑定很深的框架,接入第二门语言时改造量巨大
  • 框架治理能力远超团队需要,配置项多到无人敢改
  • 序列化用 Protobuf 但字段编号随意复用,升级后出现字段错位
  • 框架默认开启重试,叠加非幂等接口导致重复下单或重复扣款

数据来源与参考

  • gRPC 官方文档:Core Concepts
  • Apache Dubbo 官方文档:架构概述
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌