这是我参与「第五届青训营 」笔记创作活动的第5天
远程过程调用 (RPC)
什么是远程过程调用 (RPC)?
远程过程调用是一种软件通信协议,一个程序可以使用该协议从位于网络上另一台计算机上的程序请求服务,而无需了解网络的详细信息。RPC 用于像本地系统一样调用远程系统上的其他进程。过程调用有时也称为 函数调用或 子例程调用。
RPC 使用 [客户端-服务器]模型。请求程序是客户端,提供服务的程序是服务器。与本地过程调用一样,RPC 是 同步操作,要求暂停请求程序,直到返回远程过程的结果。但是,使用共享同一地址空间的轻量级进程或线程可以同时执行多个 RPC。
接口定义语言 (IDL)——用于描述软件组件的应用程序编程接口 (API) 的规范语言——通常用于远程过程调用软件。在这种情况下,IDL 在链接两端可能使用不同操作系统 (OS) 和计算机语言的机器之间提供了桥梁。
RPC 是做什么的?
当使用 RPC 框架的程序语句被编译成可执行程序时, 编译代码中包含一个存根,它充当远程过程代码的代表。当程序运行并发出过程调用时,存根接收请求并将其转发到 本地计算机中的客户端运行时程序。第一次调用客户端存根时,它会联系名称服务器以确定服务器所在的传输地址。
客户端运行时程序知道如何寻址远程计算机和服务器应用程序,并通过网络发送请求远程过程的消息。类似地,服务器包括一个运行时程序和与远程过程本身接口的存根。响应请求协议以相同的方式返回。
RPC 是如何工作的?
当调用远程过程调用时,调用环境被挂起,过程参数通过网络传送到过程要执行的环境,然后过程在该环境中执行。
当过程完成时,结果被传输回调用环境,在那里恢复执行,就像从常规过程调用返回一样。
在 RPC 期间,将执行以下步骤:
- 客户端调用客户端存根。该调用是一个本地过程调用,参数以正常方式压入堆栈。
- 客户端存根将过程参数打包到消息中,并进行系统调用以发送消息。过程参数的打包称为编组。
- 客户端的本地操作系统将消息从客户端机器发送到远程服务器机器。
- 服务器操作系统将传入的数据包传递给服务器存根。
- 服务器存根从消息中解压参数——称为解组。
- 当服务器过程完成时,它返回到服务器存根,服务器存根将返回值编组到消息中。服务器存根然后将消息传递给传输层。
- 传输层将生成的消息发送回客户端传输层,客户端传输层将消息返回给客户端存根。
- 客户端存根解组返回参数,执行返回给调用者。
RPC 的优缺点
以下是 RPC 为开发人员和应用程序管理员提供的一些优势:
- 帮助客户通过传统的高级语言过程调用与服务器通信。
- 可以在分布式环境中使用,也可以在本地环境中使用。
- 支持面向进程和面向线程的模型。
- 向用户隐藏内部消息传递机制。
- 重写和重新开发代码只需要很少的努力。
- 提供抽象,即网络通信的消息传递特性对用户是隐藏的。
- 省略许多协议层以提高性能。
另一方面,RPC 的一些缺点包括:
- 客户端和服务端各自的例程使用不同的执行环境,资源(如文件)的使用也更加复杂。因此,RPC 系统并不总是适合传输大量数据。
- RPC 非常容易失败,因为它涉及一个通信系统、另一台机器和另一个进程。
- RPC没有统一的标准;它可以通过多种方式实施。
- RPC 仅基于交互,因此在硬件架构方面不提供任何灵活性。