logo

RPC vs REST:深入对比分析

Published on

RPC 是什么?

RPC(远程过程调用)允许客户端像调用本地函数一样调用远程服务器上的函数,它封装了网络通信的复杂性。

核心组件

  • 客户端和服务端

    • 客户端:发起调用的一方
    • 服务端:托管并处理请求的一方
  • 存根(Stub/代理)

    • 客户端存根:将参数打包成消息
    • 服务端存根:解包消息并执行函数
  • 请求/响应模式

    • 客户端发送请求触发服务端响应
    • 支持同步和异步调用模式
  • 序列化

    • 数据编码/解码用于网络传输
    • 常用格式:Protocol BuffersJSONThrift

RPC 工作流程

  1. 客户端调用本地存根函数
  2. 存根将调用打包成网络消息
  3. 本地系统将消息发送至远程主机
  4. 远程存根解包消息
  5. 执行实际函数调用
  6. 将结果返回给客户端
Maple

常见实现

  • gRPC

    • 使用 HTTP/2 作为传输协议
    • 默认使用 Protocol Buffers 序列化
    • 支持双向流式传输
  • JSON-RPC

    • 使用 JSON 编码
    • 简单易用,适合 Web 环境
  • Dubbo

    • 阿里巴巴开源的 RPC 框架
    • 提供丰富的服务治理功能

REST 是什么?

REST(表述性状态转移)是一种用于创建 Web 服务的架构风格。它利用 HTTP 协议,将实体(资源)视为可通过 HTTP 方法操作的对象。

核心组件

  • 资源(Resources)

    • 通过 URI 标识(如 /api/users/api/orders
    • 每个资源都有唯一标识符
  • HTTP 方法

    • GET:获取资源
    • POST:创建资源
    • PUT:更新资源
    • DELETE:删除资源
    • PATCH:部分更新
  • 表述(Representation)

    • 资源的数据格式(通常是 JSONXML
    • 支持内容协商
  • 无状态性

    • 每个请求包含所有必需信息
    • 服务器不存储客户端状态

REST 工作流程

  1. 客户端通过 URI 发送 HTTP 请求
  2. 服务器处理请求
  3. 返回响应(数据或操作结果)
  4. 使用 HTTP 状态码表示结果
Maple

RPC vs REST 关键差异

特性RPCREST
目的远程函数调用资源操作(CRUD)
传输协议多样(HTTP、TCP 等)仅 HTTP
消息格式多样(Protobuf、JSON、XML)主要是 JSON
操作方式函数调用资源操作
状态管理可有状态或无状态无状态
耦合度紧耦合松耦合
性能通常更快(二进制协议)较慢(HTTP 开销)
扩展性需要额外努力易于扩展
错误处理框架相关标准 HTTP 状态码

使用场景选择

选择 RPC 的场景

  1. 低延迟要求

    • 微服务间的高速通信
    • 实时数据处理系统
  2. 紧耦合系统

    • 内部微服务架构
    • 同语言服务调用
  3. 复杂操作

    • 需要远程触发的具体动作
    • 复杂的业务流程

选择 REST 的场景

  1. Web 服务和 API

    • 面向公众的 API
    • 跨平台服务
  2. 资源导向设计

    • CRUD 操作为主
    • 数据管理系统
  3. 需要高扩展性

    • 大规模分布式系统
    • 云服务架构

现代趋势

虽然 REST 因其简单性和与 Web 协议的一致性而流行,但现代 RPC 实现(如 gRPC)在以下场景中获得越来越多的关注:

  • 微服务架构:高性能服务间通信
  • 实时流式处理:支持双向流通信
  • 移动应用后端:效率和带宽优化

结论

RPC 和 REST 各有优势:

  • RPC 适合对性能要求高、服务紧密耦合的场景
  • REST 适合构建灵活、可扩展的 Web 服务

选择时需要考虑:

  • 系统架构需求
  • 通信模式
  • 性能要求
  • 团队技术栈
  • 维护成本

最佳实践是根据具体用例选择合适的方案,有时甚至可以在同一系统中结合使用两种方式。