热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于RPC的理解

如何理解RPCrpc全称是远程过程调用,和本地过程调用一样,都属于进程间通信。不通的是,本地过程调用是同一物理机器上的进程间通信,而远程过程调用是在不同的物理机器上进行通信的,并且
如何理解 RPC

rpc 全称是远程过程调用,和本地过程调用一样,都属于进程间通信。不通的是,本地过程调用是同一物理机器上的进程间通信,而远程过程调用是在不同的物理机器上进行通信的,并且使其像是调用本地子程序一样简单,(注意,这里所说的子程序,可以认为就是函数)。

本地程序如何调用子程序

  1. 找到要执行的函数地址(本质是跳转到子函数的正文区地址);
  2. 传入参数(本质上,是将参数压栈);
  3. 执行子程序代码并返回结果。

因此,远程过程调用的需要解决的问题就是,如何通知远程机器需要执行哪一个函数,如何参数和返回值。

(1)如何确定调用哪一个子程序

本地调用子程序的时候,确定调用哪一个函数,是直接通过函数名即可,即通过函数的地址。而远程机器上的地址又是如何知晓的呢?因此,最初的实现,就是一个call Id 的映射表查询,比如客户端传来需要调用的函数的函数名,通过一个函数映射表,就可以找到实际需要执行的函数的实际地址。

(2)如何传参数

本地执行子程序的时候是:直接将需要的参数传给子程序即可(底层的实现是将参数进行压栈,暂时可以不管,只关心上层的调用),rpc 是调用远程机器上的“子程序”,因此,首先是需要通过网络将参数传递掉服务端的机器上。这一层同过网络既可以办到,暂不考虑如何方便。

(3)远程机器执行并返回结果

远程接收到需要执行的函数和参数信息之后,就可以执行程序并将结果返回给客户端。这就基本是 rpc 的工作过程。

《关于 RPC 的理解》 rpc调用过程.png

如图所示,图片中的描述的 rpc 执行的顺序是、

  1. client 确定调用的函数以及参数信息;
  2. 对 client 确定的信息进行一次封装,并交给socket(网络);
  3. socket 将封装后的信息发送到服务器端;
  4. 服务器对的网络接收数据并将其传递到上层;
  5. 对数据进行解封,并根据传过来的数据确定需要调用的函数;
  6. 执行相应的函数,并将结果交给封装层;
  7. 封装对返回结果进行封装,并交给网络模块;
  8. 网络模块将结果传递给client端的封装层;
  9. client端的封装层对数据进行解封,获取具体数据;
  10. 实际调用 rpc 的地方获取执行结果。

实际上,为了client调用过程中的透明性,client 的封装层对client外层提供基本和本地子程序相同的程序接口。同时,由于参数可能是一个地址或者是其他比较复杂的对象,内部的数据并不是存储在一块连续的空间中,这里会有一个序列化的过程,将存储的不同地方的数据进行调整成方便发送的数据进行发送。相对的server端就会有反序列化的操作。如果考虑到数据的大小以及安全性的问题时,可能封装层就会对数据进行压缩和加密处理。server也就需要对数据进行解密和解压缩处理。
关于传递的数据的形式:可以是key-value对的xml或者时json形式。也可以是使用类似于protobuf的协议进行传输。
而实现调用函数之间的绑定可以使用反射寻找相应的函数,也可以使用std::bind绑定对应的函数。

总结:rpc只是一种技术思想,并不是某一个特定的事物,他的目的就是使调用远程机器上的子程序像调用本地子程序一样简单,至于使用什么样的技术实现这一点,完全没有限制,而实现这个目的的具体内容是,如何确定调用的函数,如何进行信息通信而已。


推荐阅读
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 本文深入探讨了如何选择适合业务需求的MySQL存储引擎,详细解析了不同存储引擎的特点、适用场景及其在数据存储和管理中的优势。通过对比InnoDB、MyISAM等主流引擎,为读者提供了全面的技术指导和专业建议,帮助开发者在实际应用中做出明智的选择。 ... [详细]
  • Hadoop平台警告解决:无法加载本机Hadoop库的全面应对方案
    本文探讨了在Hadoop平台上遇到“无法加载本机Hadoop库”警告的多种解决方案。首先,通过修改日志配置文件来忽略该警告,这一方法被证明是有效的。其次,尝试指定本地库的路径,但未能解决问题。接着,尝试不使用Hadoop本地库,同样没有效果。然后,通过替换现有的Hadoop本地库,成功解决了问题。最后,根据Hadoop的源代码自行编译本地库,也达到了预期的效果。以上方法适用于macOS系统。 ... [详细]
  • Swoole加密机制的安全性分析与破解可能性探讨
    本文深入分析了Swoole框架的加密机制,探讨了其在实际应用中的安全性,并评估了潜在的破解可能性。研究结果表明,尽管Swoole的加密算法在大多数情况下能够提供有效的安全保护,但在特定场景下仍存在被攻击的风险。文章还提出了一些改进措施,以增强系统的整体安全性。 ... [详细]
  • 在 Axublog 1.1.0 版本的 `c_login.php` 文件中发现了一个严重的 SQL 注入漏洞。该漏洞允许攻击者通过操纵登录请求中的参数,注入恶意 SQL 代码,从而可能获取敏感信息或对数据库进行未授权操作。建议用户尽快更新到最新版本并采取相应的安全措施以防止潜在的风险。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 深入解析C#中app.config文件的配置与修改方法
    在C#开发过程中,经常需要对系统的配置文件进行读写操作,如系统初始化参数的修改或运行时参数的更新。本文将详细介绍如何在C#中正确配置和修改app.config文件,包括其结构、常见用法以及最佳实践。此外,还将探讨exe.config文件的生成机制及其在不同环境下的应用,帮助开发者更好地管理和维护应用程序的配置信息。 ... [详细]
  • 本文详细探讨了 jQuery 中 `ajaxSubmit` 方法的使用技巧及其应用场景。首先,介绍了如何正确引入必要的脚本文件,如 `jquery.form.js` 和 `jquery-1.8.0.min.js`。接着,通过具体示例展示了如何利用 `ajaxSubmit` 方法实现表单的异步提交,包括数据的发送、接收和处理。此外,还讨论了该方法在不同场景下的应用,如文件上传、表单验证和动态更新页面内容等,提供了丰富的代码示例和最佳实践建议。 ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • Android UI设计:提升用户界面体验的关键要素
    在今年的谷歌I/O开发者大会上,北京时间5月19日凌晨1点,谷歌正式推出了Android 12 Beta 1系统,并公布了参与该版本开发者Beta测试计划的手机品牌。此次发布标志着Android 12在用户体验和界面设计上的重大改进,为开发者提供了更多创新工具和资源,以进一步提升用户的交互体验。 ... [详细]
  • 在ElasticStack日志监控系统中,Logstash编码插件自5.0版本起进行了重大改进。插件被独立拆分为gem包,每个插件可以单独进行更新和维护,无需依赖Logstash的整体升级。这不仅提高了系统的灵活性和可维护性,还简化了插件的管理和部署过程。本文将详细介绍这些编码插件的功能、配置方法,并通过实际生产环境中的应用案例,展示其在日志处理和监控中的高效性和可靠性。 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
author-avatar
mobiledu2502913567
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有