【RPC】综述

 RPC定义


  RPC(Remote Procedure Call)全称远程过程调用,它指的是通过网络,我们可以实现客户端调用远程服务端的函数并得到返回结果。这个过程就像在本地电脑上运行该函数一样,只不过系统本身隐藏了发送的过程和细节。

待解决的问题


  (1)既然是远程调用服务端的服务,这就意味着服务端必须知道客户端传递过来函数名、参数名、以及表示方法的意思。这就引出了其中一个问题就是协议约定问题,在客户端和服务器进行服务调用之前,我们需要规定参数所代表的意思,怎么划分边界等等。

  (2)客户端和服务端通过网络进行调用,而在网络中会存在错误、重传、丢包等问题,这些问题我们统称为传输问题。怎么解决这些问题也成为服务是否能实现的关键问题。

  (3)服务发现问题,客户端怎么知道哪些服务可用?以及服务的端口号?这样可以避免对不可用的服务和错误的端口进行请求的时间浪费。

  对于上面的问题,不同的人有不同的解决办法。后来一个叫Nelson的人写了一片论文来定义RPC问题的解决方式和框架。  

  

  从上图我们可以看到,在客户端中,当用户进行本地调用的时候,会将参数等数据传递给本地的Stub,Stub将参数封装成双方协议规定的模式,然后发送给PRCRuntime模块,该模块主要的任务是进行网络任务,将封装好的参数发送出去,在其中并处理其他会出现的网络异常情况。服务端的PRCRuntime在接收到请求之后将数据传递给Stub模块对数据按照约定的格式进行解封,然后按照客户端的意思调用相应的函数得到结果执行同样的流程进行发送。

 RPC的早期应用


   RPC最早的应用是在NFS(网络文件系统)中,在这个文件系统中我们需要启动两个服务端,一个是mount(挂载文件路径),一个是nfsd(读写文件)。 NFS主要作用是我们可以像操作本地文件一样操作远程服务端上文件的读写。其架构图如下:

  在图中XDR(External Data Representation ,外部数据表示法)进行的是像Stub的工作,对数据按照协议进行相应的封装和解封(压缩成二进制)。例如下图:

  socket进行数据网络的传输,当然这不是简单的socket编程,这里还包含了对于异常的处理,例如超时,重试等问题。这里有一个比较出名的RPC状态转换图。可以看出对应不同的状态有相应的处理方式。

  对于服务发现问题,在NFS中通过portmapper实现的。portmapper 会启动在一个众所周知的端口上,RPC 程序由于是用户自己写的,会监听在一个随机端口上,但是 RPC 程序启动的时候,会向 portmapper 注册。客户端要访问 RPC 服务端这个程序的时候,首先查询 portmapper,获取 RPC 服务端程序的随机端口,然后向这个随机端口建立连接,开始 RPC 调用。从图中可以看出,mount 命令的 RPC 调用,就是这样实现的。

  NFS存在的缺点:(1) 需要双方的压缩格式完全一致,多一位,少一位都可能造成无法解压缩。这一点可以用传输层的可靠性以及加入校验值等方式(冗余检验码)来减少传输过程中的差错。(2) 协议修改不灵活,如果不是传输过程中造成的差错,而是客户端添加或者删除了某些字段或者服务端添加或者删除了字段,而双方没有及时通知,就会造成解压缩不成功。(3)版本的问题,比如在服务端提供一个服务,参数的格式是版本一的,因为其中一个客户端需要对服务多加一个字段,如果服务端加上这一个字段,这会导致所有的客户端都必须加上这个字段。

基于XML的SOAP协议


      

猜你喜欢

转载自www.cnblogs.com/GoodRnne/p/10665746.html
RPC