RPC(Remote Procedure Call,远程过程调用)实现跨进程级别调用的原理

server/2024/11/13 9:39:09/

RPC(Remote Procedure Call,远程过程调用)实现跨进程级别调用的原因在于它通过网络通信模拟了本地过程调用的方式,让开发者可以像调用本地函数一样调用远程服务

1. 调用流程概述

RPC 的核心思想是将远程调用过程抽象成类似本地调用的方式。这背后涉及几个关键步骤:

  1. 客户端调用:客户端在调用一个远程服务时,实际上调用的是本地的一个代理对象(Stub)。这个代理对象负责把方法调用和参数打包成请求。

  2. 序列化:代理对象将请求对象序列化(转化为字节流),以便通过网络传输。

  3. 网络传输:序列化后的请求数据通过网络传输到远程服务端。

  4. 服务端解码与处理:服务端接收到请求后,首先将请求数据解码(反序列化),然后调用实际的服务实现,处理请求并生成响应。

  5. 返回结果:处理结果通过序列化再通过网络传输回客户端。

  6. 客户端解码与返回:客户端接收到响应后,解码结果并返回给调用者。

2. 为什么可以跨进程调用

跨进程调用之所以可以实现,是因为 RPC 将网络通信、序列化、反序列化的复杂性隐藏在客户端和服务端之间。开发者只需要定义服务接口,RPC 框架负责处理底层的进程间通信。具体来说:

  • 抽象远程调用:RPC 把远程服务调用抽象成本地调用。通过客户端的代理对象(Stub),开发者可以像调用本地方法一样调用远程服务,而不需要关心实际的网络通信细节。

  • 序列化和反序列化:RPC 将方法调用和参数序列化为字节流,以适合网络传输。在服务端接收时,再将这些字节流反序列化为可操作的对象或数据结构。这使得数据能够在不同进程甚至不同机器之间传递。

  • 网络通信:RPC 框架在底层通过网络协议>网络协议(例如 TCP/IP)进行通信,客户端与服务端的进程通过网络进行数据交换。虽然客户端和服务端在不同的进程中运行,甚至可能在不同的机器上,但通过网络它们可以像共享同一进程空间一样相互通信。

  • 封装复杂性:RPC 框架将序列化、反序列化、网络传输、错误处理等复杂过程都封装在内部,让开发者无需直接面对这些问题,从而实现透明的跨进程调用。

3. 跨进程调用的实现细节

  • 接口定义:通常,RPC 使用接口定义服务。例如,客户端和服务端共享相同的服务接口,这些接口定义了可以调用的方法。

  • 客户端 Stub(代理):客户端的 Stub 代理对象负责将方法调用转换为网络请求。

  • 服务端 Skeleton(骨架):服务端的 Skeleton 接收网络请求,解析并调用对应的服务实现。

4. 示例

假设我们有一个简单的服务接口:

public interface HelloService {String sayHello(String name);
}
客户端调用

在客户端,调用 sayHello 方法:

HelloService service = ... // 代理对象
String response = service.sayHello("Alice");
底层流程
  1. 代理对象 StubsayHello("Alice") 调用被代理对象拦截,代理对象将方法名和参数打包成请求。

  2. 序列化:请求对象被序列化成字节流。

  3. 网络传输:字节流通过网络发送到服务端。

服务端处理
  1. 解码:服务端接收字节流并反序列化,得到请求对象。

  2. 服务调用:根据请求信息,调用 HelloService 实现的 sayHello 方法。

  3. 返回结果:结果通过相同的过程序列化、传输、反序列化回到客户端,最终返回给调用者。

5. 适用场景

RPC 被广泛用于分布式系统中的服务调用,如微服务架构中的服务之间的通信。它不仅能实现跨进程调用,还能支持跨机器、跨网络的远程调用。

流程图

+-----------+          +-----------+          +-------------+
| Client    |          | Network    |          | Server      |
| Process   |          | Transport  |          | Process     |
+-----------+          +-----------+          +-------------+|                      |                     || 1. Proxy Call        |                     ||--------------------->|                     ||                      | 2. Serialize & Send ||                      |-------------------->||                      |                     | 3. Receive & Deserialize|                      |                     |<--------------------||                      |                     ||                      | 4. Invoke Service   ||                      |-------------------->||                      |                     | 5. Process & Generate Response|                      |                     |<--------------------||                      | 6. Serialize & Send ||                      |-------------------->|| 7. Receive & Deserialize                   ||<---------------------|                     ||                      |                     || 8. Return Result     |                     ||<---------------------|                     |

通过以上机制,RPC 能够在跨进程、跨机器的情况下,模拟本地调用,实现进程级别的远程调用。


http://www.ppmy.cn/server/105384.html

相关文章

【vue】编辑器段落对应材料同步滚动交互

场景需求 编辑器段落对应显示材料编辑器滚动时&#xff0c;材料同步滚动编辑器段落无数据时&#xff0c;材料不显示 实现方法 编辑器与材料组件左右布局获取编辑器高度&#xff0c;材料高度与编辑器高度一致禁用材料组件的滚动事件获取编辑器段落距离顶部的位置&#xff0c;…

Vue3 后台管理系统项目 前端部分

这里写目录标题 1 创建Vue3项目1.1 相关链接1.2 Vue Router1.3 Element1.4 scss1.5 mitt1.6 axios1.7 echarts1.8 配置vite.config.js 2 CSS部分2.1 样式穿透2.2 :style &#xff1a;在样式中使用插值语法 3. ElementUI3.1 rules&#xff1a; 数据验证3.2 修改element.style中的…

UVM中的TLM(事务级建模)通信(2)

上一篇介绍了UVM中利用TLM进行的一对一通信&#xff1a;UVM中的TLM(事务级建模)通信(1)-CSDN博客&#xff0c;除此之外&#xff0c;UVM还有两种特殊的端口&#xff1a;analysis_port和analysis_export&#xff0c;用于完成一对多的通信。 1.analysis端口 这两种端口同样也是用于…

【图文并茂】ant design pro 如何实战使用 ProFormTreeSelect

上一节 【图文并茂】ant design pro 如何统一封装好 ProFormSelect 的查询请求 这一节的内容会利用上一篇文章的内容的。 我们经常会实现一个远程数据调用的 select 框&#xff0c;不过有时候这个 select 是有层级的。 就像我们这个分类一样&#xff0c;有父分类&#xff0c…

Day03-MonoBehavior中的常用内容

&#x1f3c6; 个人愚见&#xff0c;没事写写笔记 &#x1f3c6;《博客内容》&#xff1a;Unity3D开发内容 &#x1f3c6;&#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f50e;目标&#xff1a;MonoBehavior中的常用内容 ☀️实现&#xff1a;获取当前GameObject&a…

vscode tailwind插件无提示

说明 Tailwind CSS IntelliSense插件 版本: v0.12.7 问题: 无代码提示 解决 降版本

SpringBoot文档之测试框架的阅读笔记

Testing SpringBoot提供了组件spring-boot-test供开发者集成。 Test Scope Dependencies 组件spring-boot-test导入了对如下测试工具的依赖。 JUnit 5: The de-facto standard for unit testing Java applications.Spring Test & Spring Boot Test: Utilities and integra…

【知识分享】ubuntu22.04-ESP32环境搭建

文章目录 一、概要二、环境及工具介绍三、名词解释四、环境搭建 一、概要 手上有一块安信可的WIFI开发板&#xff0c;用的是乐鑫的ESP32模组。刚好最新装了双系统&#xff0c;貌似在Linux环境使用gcc编译器会快一些。     万事开头难&#xff0c;要在Linux环境下进行开发工…