一、什么是 RPC?
RPC(Remote Procedure Call,远程过程调用):让本地服务像调用本地函数一样,调用远程服务的方法,核心解决 "跨服务通信的高效性、一致性" 问题,是微服务架构的基石。
二、企业级 RPC 落地流程(以 Go 为例)
公司一般用的 "IDL→SDK→调用" 流程,是行业标准实践,完整链路如下:
- 定义 IDL(接口契约)
在公司平台编写 IDL(通常是 Protobuf 格式),明确服务方法、请求(Req)、响应(Resp),比如:
Go
service OpService {
rpc CheckOrder(CheckOrderReq) returns (CheckOrderResp); // 订单校验方法
}
message CheckOrderReq {
string order_id = 1; // 订单ID(必传)
int64 amount = 2; // 订单金额
}
message CheckOrderResp {
bool is_pass = 1; // 校验结果
string msg = 2; // 提示信息
}
作用:统一调用方和被调方的接口约定,避免参数不一致。
- 自动生成 SDK
平台通过 IDL 自动生成 Go SDK,包含核心 4 类内容(无需手动编写):
- 客户端初始化(NewClient()):封装服务地址、超时、重试策略;
- 结构体映射(CheckOrderReq/CheckOrderResp):与 IDL 完全对齐;
- 接口调用方法(client.CheckOrder()):封装 RPC 底层通信逻辑;
- 异常处理:日志、错误码转换、网络重试。
- 项目集成与调用
- 项目go.mod更新 SDK 版本,执行go mod tidy拉取依赖;
- 代码中直接调用,像本地函数一样简洁:
Go
import "company/repo/op-sdk"
// 初始化客户端
client := opsdk.NewOpClient()
// 远程调用OP服务的CheckOrder方法
resp, err := client.CheckOrder(ctx, &opsdk.CheckOrderReq{
OrderId: "123456",
Amount: 999,
})
if resp.IsPass { /* 校验通过逻辑 */ }
三、RPC 核心优势
- 高性能:二进制传输(比 HTTP 的 JSON 文本小 50%+),减少网络开销,QPS 支持更高;
- 强约定:IDL 定义死接口,编译期即可发现参数错误,避免线上故障;
- 低侵入:SDK 封装底层通信(连接、序列化、重试),开发无需关注网络细节;
- 易维护:IDL 变更后,SDK 自动生成,调用方仅需更新版本,无需修改调用逻辑。
四、企业实战
- 主流 RPC 框架:企业不会从零实现 RPC,通常基于成熟框架(Go 常用 gRPC、Kitex;Java 常用 Dubbo、gRPC),但核心流程(IDL→SDK→调用)完全一致;
- 服务发现:SDK 底层会集成服务发现(如 Nacos、Consul),无需硬编码服务 IP,客户端自动找到可用的远程服务节点,保证高可用。
五、RPC vs HTTP:关键区别
|------|-----------------------------|------------------------------|
| 对比维度 | RPC(企业内部微服务) | HTTP(对外 / 跨平台通信) |
| 传输格式 | 二进制(Protobuf 等) | 文本(JSON/XML) |
| 调用体验 | 像本地函数,简洁高效 | 需拼接 URL、处理请求头,冗余代码多 |
| 接口约束 | 强约束(IDL),编译期校验 | 弱约束(靠文档),运行时才发现错误 |
| 性能 | 高(适合高并发) | 中等(序列化 / 传输开销大) |
| 适用场景 | 内部服务通信(如 Tyche→OP、SCM→SAPI) | 对外接口(App / 商家调用系统)、跨语言 / 跨平台 |
| 开发成本 | 低(SDK 自动生成) | 高(需手动处理序列化、请求封装) |
六、总结
- RPC 核心价值:高效、可靠的内部服务通信,通过 IDL+SDK 让跨服务调用 "本地化";
- 企业实践关键:IDL 是 "契约",SDK 是 "工具",框架是 "底座",三者结合实现稳定高效的微服务通信;
- 选型原则:内部微服务用 RPC(追求性能和一致性),对外提供接口用 HTTP(追求通用性)。