RPC框架与HTTP REST的区别

一、核心概念

RPC(Remote Procedure Call,远程过程调用)和 REST(Representational State Transfer,表述性状态转移)都是常见的服务通信方式。

核心区别:

  • RPC:面向方法调用,像调用本地函数一样调用远程服务。
  • REST:面向资源操作,通过 HTTP Method 和 URI 操作远程资源。

需要注意:HTTP 是通信协议,而 RPC 和 REST 是不同的设计模型。gRPC 本身也可以基于 HTTP/2 进行通信。

例如,查询 ID 为 1001 的用户:

RPC:

复制代码
User user = userService.getUser(1001);

REST:

复制代码
GET /users/1001

二、RPC 与 REST 对比

对比维度 RPC 框架 HTTP REST
核心思想 面向方法调用 面向资源操作
调用方式 getUser(id) GET /users/DIL1
通信协议 TCP、HTTP/2、HTTP/3 等 HTTP
数据格式 Protobuf、JSON 等 通常 JSON,也支持 XML 等
性能 二进制编码实现通常更高效 JSON REST 通常开销稍高
接口定义 常用 IDL,支持代码生成 常用 OpenAPI,也支持代码生成
类型约束 通常较强 取决于 API 规范和实现
服务治理 框架通常提供或集成相关能力 常依赖网关及服务基础设施
调试方式 可能需要专用工具 curl、Postman 等
适用场景 微服务内部、高频调用 开放 API、前后端通信

注意:性能优势不是 RPC 天然具有的,而是由具体协议、编码方式、连接管理和实现决定。

三、代码实现对比

3.1 REST 示例(Spring Boot)

服务端:

复制代码
@RestController
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUser(id);
    }
}

客户端请求:

复制代码
GET /users/1001 HTTP/1.1
Host: user-service

响应:

复制代码
{
  "id": 1001,
  "name": "张三",
  "age": 25
}

3.2 RPC 示例(gRPC)

使用 Protobuf 定义接口:

复制代码
syntax = "proto3";

service UserService {
  rpc GetUser(GetUserRequest)
      returns (UserResponse);
}

message GetUserRequest {
  int64 id = 1;
}

message UserResponse {
  int64 id = 1;
  string name = 2;
  int32 age = 3;
}

Java 客户端调用:

复制代码
UserResponse user = stub.getUser(
    GetUserRequest.newBuilder()
        .setId(1001)
        .build()
);

RPC 通过生成的 Stub 代理进行调用,隐藏部分网络通信细节,但底层依然存在序列化、网络传输及反序列化开销。

四、底层通信流程

4.1 RPC 调用流程(以 gRPC 为例)

4.2 REST 调用流程(典型 JSON API)

两者都涉及网络传输和序列化,区别主要在于接口抽象、编码方式、客户端调用模型和相关基础设施。

五、RPC 为什么适合微服务内部通信?

RPC 框架通常具有以下优势:

  1. 调用方便:通过 Stub 或代理对象调用远程方法。
  2. 序列化高效:如 gRPC 使用 Protobuf,通常比 JSON 更紧凑。
  3. 接口契约清晰:通过 IDL 定义接口,自动生成跨语言代码。
  4. 支持流式通信:gRPC 支持客户端流、服务端流和双向流。
  5. 服务治理能力:部分框架提供服务发现、负载均衡、超时和重试等能力。

但 RPC 不一定在所有场景都比 REST 快。如果服务主要耗时在数据库或外部 I/O,通信协议带来的优化可能相对有限。

六、如何选择 RPC 和 REST?

业务场景 推荐方案 原因
浏览器调用后端 REST 兼容性好,调试方便
第三方开放 API REST 通用、易集成
Java 微服务内部调用 Dubbo / gRPC / REST 根据技术栈选择
多语言微服务 gRPC 跨语言代码生成
高频、低延迟调用 gRPC 等高效 RPC 框架 编码紧凑、支持连接复用
流式数据传输 gRPC Streaming 原生支持流式通信
简单 CRUD 系统 REST 开发和维护成本较低

典型微服务架构

这种架构采用:

  • 外部使用 HTTP REST,方便前端和第三方调用。
  • 内部使用 RPC,实现服务之间的高效通信。

七、面试回答参考

问题:RPC 框架与 HTTP REST 有什么区别?

RPC 是面向动作或方法调用的通信模型,而 REST 是面向资源的架构风格。

RPC 框架通常提供接口代理、代码生成、序列化以及服务治理能力,例如 Dubbo 和 gRPC。REST 通常使用 HTTP Method 和 URI 表达资源操作。

在性能方面,采用 Protobuf 和 HTTP/2 的 gRPC 通常比传统 JSON REST 更适合高频、低延迟的内部通信,但具体性能还取决于实现方式和业务负载。

实际项目中经常结合使用两者,对外通过 REST 提供开放 API,对内通过 RPC 实现有高性能或强接口契约需求的服务调用。

八、总结

一句话总结:RPC 更像调用远程函数,REST 更像操作远程资源。

关键问题 结论
RPC 一定比 REST 快吗? 不一定,取决于具体实现
RPC 可以使用 HTTP 吗? 可以,例如 gRPC 基于 HTTP/2
REST 只能使用 JSON 吗? 不是,也支持 XML 等数据格式
RPC 和 REST 能共存吗? 可以,微服务架构中很常见
怎么选择? 外部开放接口通常选择 REST,内部高频通信可以考虑 RPC
相关推荐
Tech探索者1 小时前
没有公网 IP、不会端口映射?用 Natfrp 轻松远程访问家中 NAS
网络协议·tcp/ip·智能路由器
HY小宝F1 小时前
树莓派智能摄像头系统 30 天重学计划之 Day 04 · HTTP / API:控制链入口 —— 学习总结
网络协议·学习·http
蜗牛互联网3 小时前
Java标准HTTP调用多模态模型的票据抽取前置校验
java·人工智能·python·http
福大大架构师每日一题6 小时前
mediamtx v1.21.2发布:UDP、JWT、RTSP、RTMP、HLS、WebRTC全面修复,稳定性与安全性再提升
网络协议·udp·webrtc
曹小强wxx6 小时前
Flutter 局域网设备发现:UDP 广播 + mDNS 双路合并,以及靠谱的在线判定与断线重连
物联网·网络协议·flutter
花间相见6 小时前
【计算基础|网络09】TCP(上):三次握手与四次挥手
网络·网络协议·tcp/ip
wdfk_prog7 小时前
LWIP教程 08:从 `tcp_write()` 到 ACK 清队列——TCP 数据发送、窗口与回调
网络·网络协议·tcp/ip
anew___7 小时前
《从零手写操作系统 (37):网络协议栈基础——Socket接口与TCP状态机》
网络·网络协议·tcp/ip
花间相见9 小时前
【计算基础|网络10】TCP(中):可靠传输
网络·网络协议·tcp/ip