当前位置: 首页 > news >正文

RPC原理技术

RPC原理技术

  • 背景
  • 介绍
  • 起源
  • 组件实现
  • 工作原理

背景

本文内容大多基于网上其他参考文章及资料整理后所得,并非原创,目的是为了需要时方便查看。

介绍

RPC,Remote Procedure Call,远程过程调用,允许像调用本地方法一样调用远程服务,主要解决跨内存空间调用函数/方法所面临的问题,具体分解成以下三个问题:

  • 如何确定要执行的函数?
    在本地调用中,函数主体通过函数指针函数指定,RPC中不能使用函数指针函数,因为内存地址完全不同。因此,调用方和被调用方都需要维护一个 function <-> ID 映射表,以确保能够调用正确的函数。
  • 如何表达参数?
    本地过程调用中传递的参数是通过堆栈内存结构实现的,RPC不能直接使用内存传递参数,因此参数或返回值需要在传输期间序列化并转换成字节流,反之亦然。
  • 如何进行网络传输?
    函数的调用方和被调用方通常是通过网络连接的,即 function ID 和序列化字节流需要通过网络传输,因此只要能够完成传输,调用方和被调用方就不受某个网络协议的限制。例如,一些RPC框架使用TCP协议,一些使用HTTP协议。

起源

RPC由Bruce Jay Nelson在其论文《Implementing Remote Procedure Calls》中提出,论文中说明的RPC程序包含5部分:

  • User
  • User Stub
  • RPC Runtime
  • Server Stub
  • Server

RPC

流程说明:

  1. User:作为RPC客户端发起远程调用(像调用本地方法一样)。
  2. User Stub:接收到来自 User 的远程调用请求后,编码调用的接口、方法和参数,并交给RPC客户端的 RPC Runtime 实例进行传输;
  3. RPC Runtime:RPC客户端的 RPC Runtime 实例执行传输后等待;
  4. RPC Runtime:RPC服务端的 RPC Runtime 实例接收到来自RPC客户端的远程调用请求后,将请求转发给RPC服务端的 Server Stub 处理;
  5. Server Stub:对接收到的请求进行解码,然后转发给RPC服务端的 Server 处理;
  6. Server:RPC服务端发起本地调用,将结果返回给RPC服务端的 Server Stub
  7. Server Stub:对请求处理结果进行编码,然后交给RPC服务端的 RPC Runtime 实例进行传输;
  8. RPC Runtime:RPC服务端的 RPC Runtime 实例传输编码后的请求处理结果;
  9. RPC Runtime:RPC客户端的 RPC Runtime 实例接收到请求处理结果后,将结果转发给RPC客户端的 User Stub 处理;
  10. User Stub:对请求处理结果进行解码,返回给 User

组件实现

RPC

  • RPC Server
    RPC服务端通过 RPC Server 组件导出(export)远程接口。
  • RPC Client
    RPC客户端通过 RPC Client 组件导入(import)远程接口的代理实现。
  • RPC Proxy
    远程接口的代理实现,实际的调用请求便是委托给 RPC Proxy 执行:封装调用信息,并将调用转交给 RPC Invoker 去实际执行。
  • RPC Invoker
    • 客户端:通过 RPC Connector 维持与服务端的通道 RPC Channel,并使用 RPC Protocol执行协议编码(encode),并将编码后的请求消息通过通道发送给服务端。
    • 服务端:负责调用服务端接口的具体实现并返回调用结果。
  • RPC Protocol:负责协议编解码。
  • RPC Connector:负责维持客户端和服务端之间的连接通道,并负责数据传输。
  • RPC Acceptor:负责接收客户端请求,同样使用 RPC Protocol 执行协议解码(decode)。
  • RPC Processor:接收解码后的调用信息,在服务端控制调用过程,包括管理调用线程池、超时时间等。
  • RPC Channel:数据传输通道。

工作原理

RPC原理

流程说明:

  1. Client像调用本地方法一样调用远程服务;
  2. Client Stub接收到调用请求后执行编码操作,将方法及参数进行序列化;
  3. Client Socket将消息发送给Server Socket;
  4. Server Socket接收到请求消息后发送给Server Stub;
  5. Server Stub对请求消息进行解码,并根据解码结果调用本地方法;
  6. Server本地方法执行,将执行结果返回给Server Stub;
  7. Server Stub对执行结果进行编码,并交由Server Socket进行传输;
  8. Server Socket将编码后的结果发送给Client Socket;
  9. Client Socket将结果交给Client Stub处理;
    10.Client Stub对结果进行解码并返回。

相关文章:

  • docker ps显示的参数具体是什么意思
  • java集合类详解
  • 【大数据篇】Hadoop:大数据处理的核心基石
  • 发现未来声音,靠谱的AI配音平台
  • 【云原生】K8s管理工具--Kubectl详解(一)
  • 什么是住宅IP代理?为什么需要家庭 IP 代理
  • xcode按下delete键不能删除不能使用,解决办法
  • uniappx 获取设备唯一标识(OAID、AAID、AndroidID、IMEI等) Ba-IdCode-U
  • 二叉数之插入操作
  • 如何写好科研论文(讨论)
  • 【class14】创建自己的OCR系统
  • 【加密与解密(第四版)】第六章笔记
  • 7个常见的SQL慢查询问题及其解决方法
  • 实在智能TARS:面向垂直领域自主训练的类GPT大模型
  • k8s 部署mqtt简介
  • 03Go 类型总结
  • 2018一半小结一波
  • 4. 路由到控制器 - Laravel从零开始教程
  • Android系统模拟器绘制实现概述
  • angular2开源库收集
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Logstash 参考指南(目录)
  • maya建模与骨骼动画快速实现人工鱼
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • REST架构的思考
  • SQLServer插入数据
  • TCP拥塞控制
  • Webpack 4 学习01(基础配置)
  • 飞驰在Mesos的涡轮引擎上
  • 计算机常识 - 收藏集 - 掘金
  • 强力优化Rancher k8s中国区的使用体验
  • 数组的操作
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $GOPATH/go.mod exists but should not goland
  • (12)Linux 常见的三种进程状态
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (ibm)Java 语言的 XPath API
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (分类)KNN算法- 参数调优
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .jks文件(JAVA KeyStore)
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .net Stream篇(六)
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET使用存储过程实现对数据库的增删改查
  • .NET下ASPX编程的几个小问题
  • .NET中统一的存储过程调用方法(收藏)
  • /tmp目录下出现system-private文件夹解决方法
  • ??eclipse的安装配置问题!??