RPC 分布式通信概念讲解
RPC(远程过程调用 )是一种分布式通信协议 ,核心目标是让本地程序像调用本地函数一样,调用远程服务器上的函数 / 方法,无需关心底层的网络传输、数据序列化、寻址等细节。
简单来说,RPC 就是分布式系统中的 "函数调用",核心目的是像调用本地函数一样调用远程程序
RPC 的核心思想:屏蔽 "远程" 的复杂性
在单机程序中,函数调用是直接的内存操作:
// 本地函数调用:直接在进程内存中执行
int add(int a, int b) {
return a + b;
}
// 调用:直接传参,瞬间返回
int res = add(1, 2);
而在分布式系统中,函数的定义在 Server 端 ,调用在 Client 端,两者可能跨机器、跨网络。RPC 框架帮我们做了以下工作,让调用方无感:
寻址:Client 知道要调用的 Server 的 IP / 端口。
数据序列化:将函数参数(如
int a, int b)从内存结构转成可网络传输的字节流。网络传输:通过 TCP/UDP 把字节流发送到 Server。
数据反序列化:Server 把字节流转回内存中的参数结构。
执行函数:Server 调用本地函数,得到结果。
结果回传:Server 序列化结果 → 网络传输 → Client 反序列化 → 返回给调用方。
整个流程对开发者透明,调用远程函数的代码和本地调用几乎一致。
二、RPC 的核心组成部分
一个完整的 RPC 系统通常包含 4 个核心角色:
| 角色 | 作用 | 核心工作 |
|---|---|---|
| Client(调用方) | 发起远程调用的一方 | 调用本地 "存根函数",触发 RPC 流程 |
| Client Stub(客户端存根) | Client 侧的代理 | 1. 序列化参数;2. 发起网络请求;3. 反序列化结果 |
| Server Stub(服务端存根) | Server 侧的代理 | 1. 反序列化参数;2. 调用本地真实函数;3. 序列化结果 |
| Server(服务提供方) | 提供真实函数实现的一方 | 注册服务,等待并处理 Client 请求 |
Stub(存根):可以理解为 "代理函数",是 RPC 框架自动生成的代码,负责屏蔽网络和序列化细节。
三、RPC 的完整工作流程
以 Client 调用 Server 的 add(1,2) 为例,流程如下:
-
本地调用触发 :Client 调用
rpc_add(1,2),这个rpc_add是 Client Stub 提供的代理函数。 -
参数序列化 :Client Stub 将参数
(1,2)序列化成字节流(如 Protobuf、JSON 格式)。 -
网络传输:Client Stub 通过网络协议(TCP 为主)将字节流发送到 Server 的指定端口。
-
请求解码 :Server Stub 接收字节流,反序列化成原始参数
(1,2)。 -
执行本地函数 :Server Stub 调用 Server 端的真实函数
add(1,2),得到结果3。 -
结果编码 :Server Stub 将结果
3序列化字节流。 -
结果回传:通过网络将字节流发送回 Client Stub。
-
结果解码并返回 :Client Stub 反序列化得到
3,返回给 Client 程序。
整个流程中,Client 感知不到任何网络操作,就像调用本地函数一样。
四、RPC 与 HTTP 的区别
很多人会混淆 RPC 和 HTTP,两者都是分布式通信方式,但定位不同:
| 维度 | RPC | HTTP |
|---|---|---|
| 核心目标 | 模拟本地函数调用,追求高性能、低延迟 | 浏览器 - 服务器通信标准,追求通用性、跨平台 |
| 传输协议 | 可自定义(如基于 TCP 私有协议),也可基于 HTTP/2 | 基于 HTTP/1.1、HTTP/2、HTTP/3 标准协议 |
| 序列化方式 | 高效二进制协议(Protobuf、Thrift、MsgPack) | 多为文本格式(JSON、XML),也可二进制 |
| 适用场景 | 内部分布式系统(微服务、RPC 框架)、高性能通信 | 跨语言 / 跨平台通信(前后端、第三方接口) |
| 易用性 | 需要 IDL(接口定义语言)定义函数,需生成 Stub 代码 | 无需 IDL,直接通过 URL + 方法(GET/POST)调用 |
典型例子:
- RPC:Dubbo、gRPC、Thrift、你正在实现的 C++ RPC 框架。
- HTTP:Restful API、前后端交互。
五 总结
RPC 的本质是 "分布式函数调用的封装" ,核心价值是简化分布式通信的开发成本。
正在学习的施磊老师 RPC 课程,就是从 0 到 1 实现这些核心组件:
- 用 Protobuf 做序列化 / IDL;
- 用 ZooKeeper 做服务注册与发现;
- 用 线程池 + 异步 IO 提升并发性能;
- 用 异步日志 做系统监控。
这些组件组合起来,就是一个完整的高性能分布式 RPC 框架。
接下来的文章将从四种典型线程池+Protobuf细讲+ZooKeeper进行rpc框架进行