RPC 解析

RPC(Remote Procedure Call,远程过程调用)是一种让分布式系统中的服务能够像调用本地函数一样调用远程服务的通信机制。以下是其核心原理、技术实现及组件的详细解析:


🔧 一、RPC 核心工作原理(10 步全流程)

  1. 客户端发起调用客户端调用本地接口(如 userService.getUser(101)),实际调用的是客户端存根(Client Stub)​的代理方法。
  2. 参数序列化客户端存根将方法名、参数等序列化为二进制流(如通过 Protobuf、JSON 等协议),生成网络可传输的消息体。
  3. 网络传输序列化后的数据通过 ​TCP/HTTP/HTTP2​ 等协议发送至服务端。高性能框架(如 gRPC)采用 HTTP/2 多路复用减少连接开销。
  4. 服务端接收与反序列化服务端存根(Server Stub)接收请求,​反序列化二进制流,还原为方法名和参数。
  5. 本地方法执行服务端根据方法名反射调用本地实现类,执行业务逻辑(如查询数据库)。
  6. 结果序列化服务端存根将返回结果序列化为二进制流。
  7. 响应回传序列化结果通过网络返回客户端。
  8. 客户端反序列化客户端存根反序列化响应数据,还原为对象。
  9. 结果返回客户端存根将结果返回给调用方,完成远程调用。
客户端客户端存根网络服务端存根服务端调用本地方法序列化参数发送请求传输数据反序列化请求调用服务方法返回结果序列化结果发送响应传输数据反序列化响应返回结果客户端客户端存根网络服务端存根服务端

⚙️ 二、关键技术组件详解

1. 动态代理
  • 作用:自动生成接口代理类,拦截本地调用并转发至网络层。
  • 实现方式
    • JDK 动态代理:基于接口生成代理类(需实现 InvocationHandler)。
    • 字节码增强(如 Cglib):直接修改字节码,无需接口。
2. 序列化与反序列化
  • 协议对比

    协议性能可读性适用场景
    Protobuf★★★高并发微服务(gRPC)
    JSON★☆RESTful API/Web 应用
    Thrift★★☆跨语言系统(Facebook)
  • 优化方向:减少二进制体积、支持复杂数据结构(如 Map)、跨语言兼容性。

3. 网络通信模型
  • BIO(阻塞IO):简单但并发能力差,适用于低频调用。
  • NIO(非阻塞IO):通过 Netty/Mina 实现高并发,采用 Reactor 线程模型处理海量连接。
  • 协议选择
    • TCP:直接传输,高性能(如 Dubbo)。
    • HTTP/2:支持多路复用和头部压缩(如 gRPC)。
4. 服务注册与发现
  • 流程
    1. 服务启动时向 ZooKeeper/Nacos 注册 IP 和端口。
    2. 客户端从注册中心拉取服务列表,缓存并监听变更。
    3. 调用时通过负载均衡算法(如轮询、一致性哈希)选择节点。
  • 容灾机制:心跳检测自动剔除故障节点,避免请求失败。
5. 服务治理
  • 熔断机制
    • 状态机CLOSEDOPEN(触发熔断)→ HALF_OPEN(尝试恢复)。
    • 触发条件:错误率超阈值(如 50%)或请求超时。
  • 限流算法
    • 滑动窗口:统计单位时间内的请求量(如 Sentinel)。
    • 令牌桶:匀速发放令牌,控制请求速率。
  • 优雅启动:新节点逐步接收流量,避免冷启动被压垮。

🌐 三、RPC 框架核心实现(以 Dubbo/gRPC 为例)

1. 服务端启动流程
  • 加载 @DubboService 注解,扫描服务接口。
  • 通过 Netty 绑定端口监听请求。
  • ZooKeeper 注册服务元数据。
2. 客户端调用流程
  • 通过 @Reference 注入代理对象。
  • 代理类封装序列化、网络通信逻辑。
  • 调用时从注册中心获取服务地址,发起请求。
3. 性能优化策略
  • 零拷贝序列化:跳过 JVM 堆内存,直接操作堆外内存(如 Netty 的 ByteBuf)。
  • 线程池隔离:业务逻辑与 IO 操作使用不同线程池,避免阻塞。
  • 链路压缩:HTTP/2 头部压缩减少带宽占用。

⚖️ 四、RPC 与 REST 的深度对比

维度RPCREST
通信效率高(二进制协议 + 长连接)低(文本协议 + 无状态)
开发成本需预定义 IDL 接口直接使用 HTTP 方法(GET/POST)
调试便利性需专用工具(如 gRPCurl)浏览器/Postman 可直接调试
适用场景服务间高频调用(订单→支付)对外暴露 API(开放平台)
跨语言支持强(通过 IDL 生成多语言代码)依赖 JSON/XML 解析兼

💎 五、总结

RPC 的核心价值在于屏蔽网络复杂性,通过动态代理、序列化、服务发现等组件,实现“远程调用本地化”。其高性能特性依赖二进制协议(如 Protobuf)和 NIO 通信(如 Netty),而熔断、限流等治理能力保障了分布式系统的稳定性。选型建议

  • 微服务集群:gRPC(跨语言)或 Dubbo(Java 生态)。
  • 简单交互:JSON-RPC(低门槛)。
  • 高并发场景:Thrift(轻量级二进制协议)。

理解 RPC 的底层机制,是构建高效、可靠分布式系统的基石。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/918125.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/918125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wstool的一个完整的工作流解析

moveit的仓库源码编译的时候使用的是wstool来拉取仓库的所有内容文件,其命令流程如下: wstool init src wstool merge -t src https://raw.githubusercontent.com/moveit/moveit/master/moveit.rosinstall wstool update -t src rosdep install -y --from-paths src…

对数函数分段定点实现

目录 一、原理介绍 二、代码实现 三、结果显示 四、移植到C语言中的应用 4.1. 定义定点数配置和参数 4.2. 实现分段查找函数 4.3. 实现 log10 近似计算函数 4.4. (可选)定点数转浮点数 一、原理介绍 之前的博文对数函数分段线性实…

qt系统--事件

文章目录qt系统事件处理鼠标事件鼠标移动事件处理键盘事件定时器事件窗口移动和大小改变事件结语很高兴和大家见面,给生活加点impetus!!开启今天的编程之路!! 作者:٩( ‘ω’ )و260 我的专栏&#xff1a…

Linux机器可直接使用的自动化编译文件

还在为了Linux机器上一遍遍输入编译指令苦恼吗?你需要make指令以及自己的makefile文件!在makefile中写入自己的个性化指令,让编译速度飞起,支持多文件编译一下文件为个人应用,可以直接cp到相应项目的目录,每…

Linux学习-数据结构(哈希表)

1.哈希表1.哈希算法将数据通过哈希算法映射成一个关键值,存放都在同一位置实现数据的高效存储和查找,将时间复杂度尽可能降低至O(1)2.哈希碰撞多个数据通过哈希算法得到的键值相同,称为产生哈希碰撞3.哈希表构建哈希表…

Google Chrome <139.0.7236.0 UAF漏洞

【高危】Google Chrome <139.0.7236.0 UAF漏洞 漏洞描述 Google Chrome 是美国谷歌&#xff08;Google&#xff09;公司的一款Web浏览器。 受影响版本中&#xff0c;OpenscreenSessionHost::ReportAndLogError 方法的参数使用了 std::string_view 类型来接收错误消息。当一…

CentOS8 Stream 网卡配置及重启

在 CentOS 8 Stream 中&#xff0c;网卡配置已由 NetworkManager 管理&#xff0c;传统的 ifcfg-eth0 文件仍然支持&#xff0c;但推荐使用 nmcli 或 nmtui 工具进行网络配置和管理。以下是网卡配置及重启的详细步骤&#xff1a;1. 查看当前网卡状态列出所有网卡bash复制nmcli …

SpringMvc的原理深度剖析及源码解读

一、springmvc启动加载流程1、引入spring-web.jar包时&#xff0c;在这个包的META-INF/services/javax.servlet.ServletContainerInitializer文件中定义的加载类SpringServletContainerInitializer,提供给springmvc实现初始化的操作。2、在SpringServletContainerInitializer类…

【ESP32-menuconfig(1) -- Build Type及Bootloader config】

Build Type Bootloader configmenuconfig介绍Build typeCONFIG_APP_BUILD_TYPECONFIG_APP_BUILD_TYPE_PURE_RAM_APPCONFIG_APP_REPRODUCIBLE_BUILDCONFIG_APP_NO_BLOBSCONFIG_APP_COMPATIBLE_PRE_V2_1_BOOTLOADERSCONFIG_APP_COMPATIBLE_PRE_V3_1_BOOTLOADERSBootloader config…

C++信息学奥赛一本通-第一部分-基础一-第3章-第1节

C信息学奥赛一本通-第一部分-基础一-第3章-第1节 2051 偶数 #include <iostream>using namespace std;int main() {int number; cin >> number;if (number % 2 0) {cout << "yes";} }2052 范围判断 #include <iostream>using namespace std…

自由学习记录(79)

PBRBRDF原理&Unity实现深入浅出_哔哩哔哩_bilibili 进行改进 一个像素点对应一个范围内的 一个微表面--一个由无数个起起伏伏的结构组成的物理结构 屏幕上的每一个像素点&#xff0c;在渲染时通常会被视为一个“微表面”的代表 比如在这个图中&#xff0c;只关心红色的区…

复杂路况误报率↓78%!陌讯轻量化模型在车辆违停识别的边缘计算优化​

一、行业痛点&#xff1a;动态交通场景的识别困境据《2024中国智慧交通白皮书》统计&#xff0c;城市核心路段违停误报率高达35%&#xff0c;主要源于两大难点&#xff1a;​​短暂停靠干扰​​&#xff1a;出租车临时停靠与违停行为特征重叠​​复杂背景干扰​​&#xff1a;树…

大语言模型提示工程与应用:提示词基础使用方式

提示词使用方式 学习目标 在本课程中&#xff0c;我们将学习更多关于提示词使用方式。 相关知识点 提示词使用 学习内容 1 提示词使用 1.1 文本摘要 语言模型最典型的应用场景之一就是文本摘要。我们可以通过以下提示实现基础摘要功能&#xff1a; 提示: 解释抗生素是什么回答&…

常见命令-资源查看-iostat命令实践

文章目录 系统中未安装 iostat 命令 1. 监控CPU与磁盘的基础负载 2. 诊断I/O性能瓶颈 3. 实时监控与动态采样 4. 特定设备或分区的精细化监控 5. 性能测试与基准数据生成 6. 结合其他工具进行综合调优 总结 结果输出速查表 第一部分:CPU统计信息 第二部分:设备/磁盘统计信息(…

WinForm 实战 (进度条):用 ProgressBar+Timer 打造动态进度展示功能

目录 核心控件解析​ ProgressBar 进度条​ Timer 定时器​ 实战案例 常见应用场景​ 总结​ 在 WinForm 桌面应用开发中&#xff0c;进度反馈是提升用户体验的关键环节。无论是文件处理、数据加载还是复杂计算&#xff0c;一个直观的进度条能让用户清晰了解任务状态&…

使用 ast-grep 精准匹配指定类的方法调用(以 Java 为例)

使用 ast-grep 精准匹配指定类的方法调用&#xff08;以 Java 为例&#xff09; 在代码重构、安全审计或静态分析的场景中&#xff0c;我们常常需要匹配某个特定类中定义的方法调用。而 ast-grep 作为一款基于语法树的代码搜索工具&#xff0c;提供了强大的模式匹配功能&#…

Dijkstra?spfa?SPstra?

带负权的无负环最短路问题 对于一张有负边权的图&#xff0c;普通 Dijkstra 就不能用了&#xff0c;比如&#xff1a;正常的 Dijkstra 扩散的节点依次为 1,3,2,41,3,2,41,3,2,4。 这时候可以发现&#xff0c;当点 222 扩散的时候&#xff0c;原本达到点 333 的路径长度是 111&a…

React函数组件灵魂搭档:useEffect深度通关指南!

你以为它只是替代componentDidMount&#xff1f;数据抓取、事件绑定、定时清理...&#xff1f;事实上&#xff0c;useEffect才是函数组件的“幕后操控者”&#xff01;但依赖数组的坑、闭包的陷阱&#xff0c;你真的玩转了吗&#xff1f; 告别“能用就行”&#xff0c;今天带你…

LabVIEW实验室测试框架

在实验室测试场景中&#xff0c;选用合适的 LabVIEW 框架能够极大提升测试效率、优化测试流程并保障测试结果的准确性。介绍几款常用且功能强大的 LabVIEW 测试框架&#xff1a;​TestStand​框架概述​TestStand 是 NI 公司专为测试系统开发设计的一款测试执行管理框架。它能够…

Kiro :从“规范”到“实现”的全流程 AI 助手

为什么是 Kiro Kiro 是一款面向“规范驱动开发”&#xff08;Spec-Driven Development&#xff09;的 AI 开发助手。与只在“写代码”环节辅助不同&#xff0c;Kiro 将“从需求到设计再到实现”的完整链路显性化&#xff0c;把需求、设计、任务分解、代码与测试、文档等全部纳…