RPC分布式通信(1)--分布式通信讲解

RPC 分布式通信概念讲解

RPC(远程过程调用 )是一种分布式通信协议 ,核心目标是让本地程序像调用本地函数一样,调用远程服务器上的函数 / 方法,无需关心底层的网络传输、数据序列化、寻址等细节。

简单来说,RPC 就是分布式系统中的 "函数调用",核心目的是像调用本地函数一样调用远程程序

RPC 的核心思想:屏蔽 "远程" 的复杂性

在单机程序中,函数调用是直接的内存操作:

复制代码
// 本地函数调用:直接在进程内存中执行
int add(int a, int b) {
    return a + b;
}
// 调用:直接传参,瞬间返回
int res = add(1, 2);

而在分布式系统中,函数的定义在 Server 端调用在 Client 端,两者可能跨机器、跨网络。RPC 框架帮我们做了以下工作,让调用方无感:

  1. 寻址:Client 知道要调用的 Server 的 IP / 端口。

  2. 数据序列化:将函数参数(如 int a, int b)从内存结构转成可网络传输的字节流。

  3. 网络传输:通过 TCP/UDP 把字节流发送到 Server。

  4. 数据反序列化:Server 把字节流转回内存中的参数结构。

  5. 执行函数:Server 调用本地函数,得到结果。

  6. 结果回传: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) 为例,流程如下:

  1. 本地调用触发 :Client 调用 rpc_add(1,2),这个 rpc_add 是 Client Stub 提供的代理函数。

  2. 参数序列化 :Client Stub 将参数 (1,2) 序列化成字节流(如 Protobuf、JSON 格式)。

  3. 网络传输:Client Stub 通过网络协议(TCP 为主)将字节流发送到 Server 的指定端口。

  4. 请求解码 :Server Stub 接收字节流,反序列化成原始参数 (1,2)

  5. 执行本地函数 :Server Stub 调用 Server 端的真实函数 add(1,2),得到结果 3

  6. 结果编码 :Server Stub 将结果 3 序列化字节流。

  7. 结果回传:通过网络将字节流发送回 Client Stub。

  8. 结果解码并返回 :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框架进行

相关推荐
西***63472 小时前
三大一体化音视频管理平台:技术特性与场景落地全解析
分布式
php_kevlin3 小时前
websocket实现站内信
android·websocket·网络协议
2401_865854883 小时前
ssl证书使用中可能会遇到的问题
网络·网络协议·ssl
少许极端3 小时前
Redis入门指南(六):从零到分布式缓存-数据持久化与事务
redis·分布式·缓存·事务·持久化
捷米研发三部4 小时前
CANopen 转 Modbus TCP:智能机床控制器与上位机监控系统的无缝对接方案
网络·网络协议
陈震_4 小时前
分布式解决方案
分布式
txinyu的博客4 小时前
UDP & TCP
网络协议·tcp/ip·udp
Leon-zy4 小时前
Redis7.4.5集群部署3主3从
redis·分布式·缓存·云原生
一颗青果4 小时前
IP分片与组装
网络·网络协议·tcp/ip