什么是 RPC 框架选型
RPC 框架决定了服务间调用的协议、序列化方式与治理能力。gRPC 基于 HTTP/2 与 Protocol Buffers,跨语言、强类型、支持流式调用;Dubbo 一类框架以私有协议为主,深度绑定 Java 生态并内置注册发现、路由与熔断。选型的实质是判断需要多少治理能力,以及团队要为此付出多少配置与运维成本。
基本信息
| 协议层 | HTTP/2、私有长连接协议或双协议并存 |
|---|---|
| 序列化 | Protobuf、Thrift、Hessian、JSON 等,影响性能与可调试性 |
| 治理能力 | 注册发现、负载均衡、熔断限流、灰度路由 |
| 配套生态 | 可观测接入、配置中心、多语言 SDK 成熟度 |
框架对照
| 维度 | gRPC | Dubbo 类框架 |
|---|---|---|
| 协议 | 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治理能力要匹配组织规模:小团队引入重型治理框架,注册中心、配置与运维的复杂度常常超过业务本身。
超时与重试在框架层的默认值要显式覆盖:默认重试会放大下游压力,非幂等接口上尤其危险。