什么是 RPC?
RPC(Remote Procedure Call)远程过程调用
是一种通信机制,允许调用远程服务器上的函数,就像本地方法一样自然透明。
为什么需要 RPC?
随着微服务架构流行,系统被拆分为多个服务部署在不同主机或进程中,传统的本地方法调用失效。此时:
-
服务之间需要跨网络通信
-
需要一种机制来隐藏底层通信细节
-
提升开发效率与调用一致性
RPC 本质是思想
RPC = 本地调用抽象 + 通信实现机制
- 屏蔽底层传输细节
- 实现接口驱动式开发
- 提升开发体验和性能
RPC 核心组成
| 组件 | 作用 |
|---|---|
| 客户端 Stub | 本地伪装函数,封装参数发起远程请求 |
| 服务端 Stub | 解包请求,调用本地逻辑,返回结果 |
| 通信协议(TCP/HTTP) | 控制数据如何在网络上传输 |
| 序列化协议(Protobuf) | 控制参数如何压缩/还原 |
| 服务注册与发现 | 动态发现服务地址(如 Nacos) |
| 负载均衡与容错机制 | 提升系统可用性与稳定性 |
| 健康检查与连接管理 | 服务节点存活监测、长连接维持 |
RPC ≠ 非 HTTP
RPC 是调用方式,HTTP 只是传输协议之一
| 误区 | 正确认识 |
|---|---|
| RPC = TCP | 现代 RPC 框架如 gRPC/Dubbo3 也支持 HTTP/2,协议可插拔 |
| HTTP 性能差 | HTTP/2 支持多路复用、头部压缩,配合 Protobuf 也能高性能 |
| REST 比 RPC 简单 | REST 面向资源建模适合对外接口,RPC 面向行为接口更适合内部调用 |
RPC 是一种调用范式,可使用 TCP、HTTP、HTTP/2 等协议,关键在于屏蔽通信细节,模拟本地调用
RPC vs RESTful
RPC 和 RESTful 都是服务间通信方式,但它们本质上是两种完全不同的设计思想
| 对比维度 | RPC | RESTful |
|---|---|---|
| 核心思想 | 面向行为:调用一个远程方法(函数 + 参数) | 面向资源:对 URL 表示的资源进行操作(GET/POST) |
| 接口建模方式 | 接口抽象为方法,强调方法名 + 参数类型,强类型接口 | 接口抽象为资源路径,强调动词语义,统一资源风格 |
| 协议层 | 多种协议可选(TCP、HTTP、HTTP/2、QUIC) | 基于 HTTP 协议栈构建 |
| 序列化方式 | 通常用 Protobuf、Thrift(高性能二进制协议) | JSON、XML(文本格式,易读但开销大) |
| 开发体验 | 像调用本地方法一样(工具生成客户端 Stub) | 请求手动拼接 URL + 参数,开发体验相对一般 |
| 性能表现 | 更高性能:长连接、连接复用、压缩传输、协议轻量 | 开销更高:短连接、文本传输 |
| 常见场景 | 服务间调用(Service-to-Service) | 开放 API、Web 服务、前后端接口 |
| 典型代表 | gRPC、Dubbo、Thrift | Spring MVC、Express、FastAPI |
可视结构图:RPC 通信流程
[客户端代码] --> [Stub] --> [序列化] --> [传输协议] --> [服务端 Stub] --> [服务实现]
| |
像本地方法一样调用 响应数据 --> 返回结果
一句话记住 RPC
RPC 是一种“让你感觉在本地调用”的远程通信机制。它本身就是思想 + 工具链的集合。