RPC vs REST:深入对比分析
- Published on
RPC 是什么?
RPC(远程过程调用)允许客户端像调用本地函数一样调用远程服务器上的函数,它封装了网络通信的复杂性。
核心组件
客户端和服务端:
- 客户端:发起调用的一方
- 服务端:托管并处理请求的一方
存根(Stub/代理):
- 客户端存根:将参数打包成消息
- 服务端存根:解包消息并执行函数
请求/响应模式:
- 客户端发送请求触发服务端响应
- 支持同步和异步调用模式
序列化:
- 数据编码/解码用于网络传输
- 常用格式:
Protocol Buffers
、JSON
、Thrift
RPC 工作流程
- 客户端调用本地存根函数
- 存根将调用打包成网络消息
- 本地系统将消息发送至远程主机
- 远程存根解包消息
- 执行实际函数调用
- 将结果返回给客户端

常见实现
gRPC:
- 使用
HTTP/2
作为传输协议 - 默认使用
Protocol Buffers
序列化 - 支持双向流式传输
- 使用
JSON-RPC:
- 使用 JSON 编码
- 简单易用,适合 Web 环境
Dubbo:
- 阿里巴巴开源的 RPC 框架
- 提供丰富的服务治理功能
REST 是什么?
REST(表述性状态转移)是一种用于创建 Web 服务的架构风格。它利用 HTTP 协议,将实体(资源)视为可通过 HTTP 方法操作的对象。
核心组件
资源(Resources):
- 通过 URI 标识(如
/api/users
、/api/orders
) - 每个资源都有唯一标识符
- 通过 URI 标识(如
HTTP 方法:
GET
:获取资源POST
:创建资源PUT
:更新资源DELETE
:删除资源PATCH
:部分更新
表述(Representation):
- 资源的数据格式(通常是
JSON
或XML
) - 支持内容协商
- 资源的数据格式(通常是
无状态性:
- 每个请求包含所有必需信息
- 服务器不存储客户端状态
REST 工作流程
- 客户端通过 URI 发送 HTTP 请求
- 服务器处理请求
- 返回响应(数据或操作结果)
- 使用 HTTP 状态码表示结果

RPC vs REST 关键差异
特性 | RPC | REST |
---|---|---|
目的 | 远程函数调用 | 资源操作(CRUD) |
传输协议 | 多样(HTTP、TCP 等) | 仅 HTTP |
消息格式 | 多样(Protobuf、JSON、XML) | 主要是 JSON |
操作方式 | 函数调用 | 资源操作 |
状态管理 | 可有状态或无状态 | 无状态 |
耦合度 | 紧耦合 | 松耦合 |
性能 | 通常更快(二进制协议) | 较慢(HTTP 开销) |
扩展性 | 需要额外努力 | 易于扩展 |
错误处理 | 框架相关 | 标准 HTTP 状态码 |
使用场景选择
选择 RPC 的场景
低延迟要求:
- 微服务间的高速通信
- 实时数据处理系统
紧耦合系统:
- 内部微服务架构
- 同语言服务调用
复杂操作:
- 需要远程触发的具体动作
- 复杂的业务流程
选择 REST 的场景
Web 服务和 API:
- 面向公众的 API
- 跨平台服务
资源导向设计:
- CRUD 操作为主
- 数据管理系统
需要高扩展性:
- 大规模分布式系统
- 云服务架构
现代趋势
虽然 REST 因其简单性和与 Web 协议的一致性而流行,但现代 RPC 实现(如 gRPC)在以下场景中获得越来越多的关注:
- 微服务架构:高性能服务间通信
- 实时流式处理:支持双向流通信
- 移动应用后端:效率和带宽优化
结论
RPC 和 REST 各有优势:
- RPC 适合对性能要求高、服务紧密耦合的场景
- REST 适合构建灵活、可扩展的 Web 服务
选择时需要考虑:
- 系统架构需求
- 通信模式
- 性能要求
- 团队技术栈
- 维护成本
最佳实践是根据具体用例选择合适的方案,有时甚至可以在同一系统中结合使用两种方式。