RPC
一、RPC 的第一性原理
1.1 从本地方法调用谈起
在单机程序中,一次方法调用本质上是:
- 参数在调用方与被调用方之间通过 **内存** 传递
- 调用目标由 **编译期或运行期指令** 唯一确定
- 执行过程在 **同一地址空间** 内完成
- 调用结果通过 **调用栈** 返回
关键抽象:本地方法调用是一种 可靠、低延迟、强一致的控制转移。
RPC 的根本目标,是在 进程边界、机器边界甚至网络边界之外,尽可能复现这种“方法调用语义”。
1.2 从内存到网络:为什么 RPC 不可避免地复杂
当调用跨越进程或主机边界时:
- 内存不再共享
- 调用栈无法贯通
- 执行环境不再一致
必须引入新的数据传递机制:
- 进程内通信(Pipe、Signal、Shared Memory)
- 网络通信(Socket)
本质变化:调用从“内存级协作”退化为“不可靠介质上的消息交换”。
RPC 并没有消除复杂性,而是 对复杂性的工程化封装。
1.3 分布式系统的不可违背前提
RPC 设计必须直面分布式系统的基本现实:
- 网络不可靠
- 延迟不可忽略
- 节点会失败
- 拓扑会变化
工程结论:RPC 的失败不是异常,而是常态。
因此:
- RPC ≠ 远程方法调用
- RPC = **在失败常态下模拟调用语义的系统工程**
二、RPC 的通用架构模型(核心)
任何 RPC 框架,无论名称与实现如何,其能力都可以抽象为以下几个稳定模块。
2.1 数据表示层:如何描述与演化数据
核心问题
- 如何让不同语言、不同版本的系统理解同一份数据?
抽象原则
- **结构化优于文本化**
- **显式 schema 优于隐式约定**
- **向前 / 向后兼容是第一设计目标**
常见实现思想
- IDL(Interface Definition Language)
- 字段编号而非字段名
- 类型显式编码
数据协议的本质不是“序列化速度”,而是 系统演进能力。
2.2 通信抽象层:如何跨不可靠介质传递消息
核心问题
- 如何在网络上传递请求与响应?
稳定设计要素
- 连接管理(短连接 / 长连接)
- IO 模型(阻塞 / 非阻塞 / 多路复用)
- 数据传输语义(请求-响应 / 单向 / 流式)
通信层关注的是 吞吐、延迟与资源利用率,而非业务语义。
2.3 调用语义层:如何“像调用方法一样”使用远程服务
核心抽象
- Stub / Proxy
- 同步 / 异步
- Future / Callback / Reactive
本质目标
- 将“消息发送”包装为“函数调用体验”
调用语义层是 RPC 对开发者体验的核心贡献。
2.4 服务发现与路由:如何找到正确的服务实例
核心问题
- 服务实例是动态变化的
抽象能力
- 注册(Register)
- 订阅(Subscribe)
- 通知(Notify)
服务发现解决的是 拓扑不稳定性问题。
2.5 负载均衡:如何在多个实例之间分配请求
稳定策略模型
- 随机 / 轮询
- 权重感知
- 最小负载 / 最少活跃
- 一致性哈希
负载均衡的本质是 风险与压力的分散。
2.6 容错与失败处理:如何面对必然失败
必须显式设计的能力
- 超时控制
- 重试策略
- 快速失败
- 幂等保障
不设计失败路径的 RPC 系统,在规模化后一定崩溃。
2.7 可观测性与治理:系统如何被理解与控制
稳定治理能力
- 调用链路追踪
- 指标统计(QPS / Latency / Error)
- 依赖关系可视化
治理能力决定了 RPC 系统的 长期可运维性。
三、框架如何映射这些抽象能力
3.1 Dubbo:以性能与治理为核心的 RPC 实现
能力映射
- IDL / 接口 → 服务契约
- Registry → 动态服务发现
- Cluster → 容错策略组合
- LoadBalance → 客户端路由决策
- SPI → 插件化扩展点
Dubbo 的核心价值不在“快”,而在 治理能力完备。
3.2 Spring Cloud / HTTP:以生态整合为优先的取舍
- 通信协议选择 HTTP
- 更强调标准化与跨语言
- RPC 语义弱于 Dubbo
本质差异不是技术,而是 设计目标不同。
3.3 框架不是答案,取舍才是
| 维度 | Dubbo | Spring Cloud |
|---|---|---|
| 性能 | 高 | 中 |
| 治理 | 强 | 依赖组件 |
| 生态 | 聚焦 RPC | 全栈微服务 |
四、RPC 的代价、边界与演进哲学
4.1 RPC 带来的系统性成本
- 强同步依赖
- 服务耦合加深
- 故障传播放大
4.2 RPC 的适用边界
- 内部服务调用
- 强一致交互
不适合:
- 高不确定网络
- 大规模异步处理
4.3 演进方向
- 同步 RPC → 异步 / 事件驱动
- 点对点调用 → 服务网格治理
- 框架能力 → 平台能力
五、总结:RPC 的工程哲学
- RPC 不是“远程方法调用”
- RPC 是 **对不可靠世界的工程妥协**
- 框架会变化,能力模型不会
关联内容(自动生成)
- [/软件工程/微服务/微服务.html](/软件工程/微服务/微服务.html) 微服务架构是RPC技术应用的重要场景,RPC作为微服务间通信的核心机制,两者在分布式系统中紧密关联
- [/软件工程/微服务/服务治理/服务发现.html](/软件工程/微服务/服务治理/服务发现.html) 服务发现是RPC框架的重要组成部分,解决了服务实例动态变化时的寻址问题,是实现RPC调用的基础设施
- [/软件工程/架构/系统设计/分布式/分布式系统.html](/软件工程/架构/系统设计/分布式/分布式系统.html) RPC是分布式系统中实现节点间通信的核心技术,分布式环境中的网络不可靠性、延迟等问题直接影响RPC的设计与实现
- [/软件工程/微服务/服务治理/服务治理.html](/软件工程/微服务/服务治理/服务治理.html) 服务治理涵盖了RPC调用的全生命周期管理,包括服务注册、发现、路由、负载均衡、容错等,是RPC系统稳定运行的保障
- [/软件工程/架构/系统设计/网关.html](/软件工程/架构/系统设计/网关.html) API网关通常承担着服务聚合和流量路由功能,与RPC框架配合实现服务间通信和客户端访问控制
- [/软件工程/架构/系统设计/分布式/分布式事务.html](/软件工程/架构/系统设计/分布式/分布式事务.html) RPC是分布式系统中实现跨服务操作的基础,而分布式事务则解决了RPC调用链路中数据一致性问题
- [/软件工程/架构/系统设计/可观测性.html](/软件工程/架构/系统设计/可观测性.html) RPC调用的链路追踪、监控指标和日志是分布式系统可观测性的重要组成部分,帮助理解和优化系统性能
- [/软件工程/微服务/服务治理/服务容错.html](/软件工程/微服务/服务治理/服务容错.html) RPC框架通常集成了服务容错能力,如超时控制、重试策略、熔断机制等,以应对分布式系统中的各种故障
- [/计算机网络/应用层.html](/计算机网络/应用层.html) RPC作为应用层协议,依赖网络层提供的传输服务,理解应用层协议设计原理对实现高效的RPC系统至关重要