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
相关推荐
尹人入圣29 分钟前
目前热门的IP驱动产业新场景新工具
网络·python·网络协议·tcp/ip
IT古董12 小时前
Modbus TCP 详解:工业设备通信协议与 MES 集成实战
网络·网络协议·tcp/ip
小此方12 小时前
C++ 工程组件与基础设施(三)详解RPC服务的概念与安装,图片介绍Brpc服务器和客户端的搭建过程
服务器·c++·rpc
tedcloud12313 小时前
Docker Compose 部署 Uptime Kuma:配置 HTTPS、QQ 邮箱告警与数据备份
服务器·网络协议·ui·docker·容器·https·开源
嵌入式学习菌13 小时前
HTTP/HTTPS、MQTT/MQTTS 区别
网络协议·http·https
2501_915106321 天前
抓包抓到乱码或压缩字节怎么解析,TraceEagle五种查看模式和一键解码
网络协议·计算机网络·网络安全·ios·adb·https·udp
情 九1 天前
MCP 实战 06:把 HTTP 接口接成工具,让 AI 帮你查数据
人工智能·网络协议·http·mcp
Da Da 泓1 天前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目
万联WANFLOW1 天前
异地组网速度忽快忽慢到底怎么回事?直连与中继的判断方法和处理步骤
运维·网络·网络协议·p2p
步行cgn1 天前
HTTP 请求报文结构详解:请求行、请求头、请求体各自的作用
网络·网络协议·http