从0到0.1学习 RPC远程过程/方法调用

全称:Remote Procedure Call 远程过程调用
标签:

  • 分布式
  • 远程调用
  • 网络传输
  • 客户机-服务器系统

为什么需要RPC

两台服务器之间想要互相/单方面的调用另一台服务器上面的函数或者方法,这时不共享一个内存空间的两台服务器并不能直接调用,只能通过网络来传达要调用的信息与返回值。RPC实际上是让我们用像调用本地函数一样去调用远程的函数,所以RPC内部会完成网络传输和连接的任务,这样使用户没有感知到该方法是远程的。

所以远程调用会产生的问题是什么呢?

  1. 函数ID映射:怎么告诉另一台服务器我想要的是A函数,而不是BCD函数呢?所以在RPC中,每个函数都要拥有一个自己的ID,在两个服务器都要维护一个(函数名,ID)的表,因此来通过ID来确定想要调用的函数
  2. 参数传递:如何把参数传递给远程的服务器呢?对于发送参数的服务器来说,它需要先把参数转换为一个字节流再进行传递,对于接收参数的服务器来说,他需要将传来的字节流再转为自己可以读取的格式。该过程为序列化与反序列化
  3. 网络传输:在两台服务器上,是通过网络连接的。因此需要有一个网络传输层,网络传输层将ID与序列化的参数传给接收方。

因此完成这三个因素,RPC包含的内容就有了基础的雏形了。

RPC的特点

引入存根的概念(stub)

  • 本地客户端中,能够独立运行的远程过程都会拥有一个客户存根。本地调用远程过程实际上是存根的调用。
  • 在远程服务器端,对其可执行方法也会存在一个存根。
  • 平时,本地客户存根与远程客户存根都处于阻塞状态。

主要步骤

  1. 本地进程使用一般的方式调用远程方法的存根,传递对应的参数,把控制权交给客户存根,客户存根由阻塞态转入运行态。
  2. 客户存根进行执行,其中会根据 过程名+调用参数等 建立一个消息。完成后,将控制权交回给本地客户进程。
  3. 本地客户进程将该消息发送到远程服务器进程。
  4. 远程服务器根据该消息,通过其中的过程名,找到对应的服务器存根,将消息转发给该存根。
  5. 服务器存根收到消息后,由阻塞转入到执行状态,通过消息内容得到参数列表,再以一般方式调用服务器上的过程
  6. 服务器过程执行完毕后,将结果返回给与之关联的服务器存根
  7. 该服务器存根获得控制权运行,将结果以消息的形式打包,并把控制权交回远程服务器进程。
  8. 远程服务器将消息转回本地客户端。
  9. 本地进程收到消息后,根据其中的过程名信息找到对应的客户存根,将控制权转回给客户存根。
  10. 客户存根从消息中得到运行结果返回给本地调用者进程,完成控制权的转移。

总结讲,本地方法通过存根的形式,避免掉了与服务端方法的直接交互。服务端也可以通过存根建立的信息得到具体的调用信息,再通过存根建立消息的方式进行回传。因此,他们中间的步骤都是不可见的。

猜你喜欢

转载自blog.csdn.net/ptyp222/article/details/114640192