Remote Procedure Calls(RPC)

什么是RPC

RPC是进程间通信(IPC)的一种形式,它基于本地程序调用的扩展概念,调用程序和被调用的程序不需要存在于相同的地址空间中。因为不同的进程具有不同的地址空间。如果在同一主机上,即使物理地址空间相同,他们具有不同的虚拟地址空间。而如果他们在不同的主机上,则物理地址空间不同。
远程过程调用和本地调用之间的一个区别是远程调用可能由于不可预测的网络问题而失败,此外,调用者通常必须处理在不知道远程程序是否可用情况下的失败问题。

RPC如何工作

RPC是一种请求-响应协议,RPC由客户端启动,客户端向已知的远程服务器发送请求消息,以使用提供的参数执行指定的过程。远程服务器向客户端发送响应,应用程序继续其进程。当服务器正在处理调用时,客户端被阻塞(它等待服务器在恢复执行之前完成处理),除非客户端向服务器发送异步请求。
下图是两个联网系统之间的RPC调用期间所进行的活动流。客户端进行远程过程调用,向服务器发送请求并等待。线程被阻塞直到收到响应或请求超时。当请求到达时,服务器调用要请求的服务例程,并将响应发送给客户端。RPC调用完成后,客户端程序继续,RPC专门支持网络应用程序。
Remote Procedure Calls(RPC)

RPC应用开发

例如假设我们无法从本地计算机访问数据库,需要在远程计算机上的个人数据库中查找。
我们可以使用UNIX来运行远程shell,并以这种方式执行命令。但是这种方法存在一些问题:

  • 该命令可能执行缓慢
  • 你需要在远程计算机上登陆账户

当然,我们也可以使用RPC来替代,通过

  • 在远程计算机上建立可以响应查询的服务器
  • 通过调用查询来检索信息,该查询比以前的方法更快。

注意: 要开发RPC应用程序,需要执行以下步骤:

  1. 指定客户端服务器通信的协议
  2. 开发客户端程序
  3. 开发服务器程序

这些程序将会被单独编译,通信歇息是通过生成的stubs(存根)来实现的,这些stubs需要和rpc(以及其他库)连接在一起。

客户机和服务器通过网络完成 RPC 调用的步骤

  1. 服务器 RPC 应用程序初始化期间它会向 RPC 运行时库注册接口。需要注册接口是因为,客户机在向服务器发出远程过程调用时,要检查它是否与服务器兼容。服务器创建绑定信息并把信息存储在名称服务数据库中,客户机可以访问这个数据库并寻找到服务器的连接信息。服务器如果使用动态端点,那么它把端点信息放在服务器系统上的本地端点映射数据库中。本地端点映射数据库用于存储在此主机上运行的 RPC 服务器进程的所有端点。服务器启动,监听来自客户机的远程过程调用。
  2. 客户机发出远程过程调用,此时它会联系名称服务数据库,以寻找服务器系统的相关信息。RPC 运行时库使用这些信息联系服务器系统上的本地端点映射数据库,了解服务器进程在哪个端点上监听到达的 RPC。
  3. 客户机找到服务器之后,客户机 stub 把远程过程调用和参数转换为服务器 stub 可以理解的格式,然后交给客户机运行时,由客户机运行时通过网络传输这些信息。
  4. 服务器 RPC 运行时库接收到达的 RPC 调用,把它传递给服务器 stub,服务器 stub 把它转换为服务器可以理解的格式。
  5. 执行 RPC 调用之后,服务器 stub 和服务器运行时把结果发送回客户机。
  6. 客户机 RPC 运行时接收执行结果,传递给客户机 stub,客户机 stub 再把它传递给客户机进程。客户机应用程序从客户机 stub 接收结果并完成 RPC 调用。

参考文章

  1. Remote Procedure Calls
  2. Remote procedure call
  3. RPC 编程