RMI And RPC

"Difference in RMI And RPC"

Posted by Ming on February 25, 2019

“If you listen to the music, the world changes. It’s like falling in love. Only no one gets hurt. ”

1.RPC简介

RPC(Remote Procedure Call Protocol,远程过程调用协议),它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

RPC示意图

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

一次RPC调用的过程大概有10步:

  • 执行客户端调用语句,传送参数
  • 调用本地系统发送网络消息
  • 消息传送到远程主机
  • 服务器得到消息并取得参数
  • 根据调用请求以及参数执行远程过程(服务)
  • 执行过程完毕,将结果返回服务器句柄
  • 服务器句柄返回结果,调用远程主句的系统网络服务发送结果
  • 消息传回本地主机
  • 客户端句柄由本地主机的网络服务接收消息
  • 客户端接收到调用语句返回的结果数据

RPC框架的实现思路:

  1. 通信模型:假设通信的为A机器与B机器,A与B之间有通信模型,在Java中一般基于BIO或NIO;
  2. 过程(服务)定位:使用给定的通信方式,与确定IP与端口及方法名称确定具体的过程和方法;
  3. 远程代理对象:本地调用的方法(服务)其实是远程方法的本地代理,因此可能需要一个远程代理对象,对于JAVA而言,远程代理对象可以使用JAVA的动态对象实现,封装了调用远程方法调用;
  4. 序列化,将对象名称、方法名称、参数等对象信息进行网络传输需要转换为二进制传输,这里可能需要不同的序列化技术方案。如:protobuf,Arvo等。

2.RMI简介

RMI(Remote Method Invocation, 远程方法调用)。能够让在客户端JAVA虚拟机上的对象像调用本地对象一样调用服务器端JAVA虚拟机中的对象上的方法。

实现原理 客户端只与代表远程主机中对象的Stub对象进行通信,丝毫不知道Server的存在。客户端只是调用Stub对象中的本地方法,Stub对象是一个本地对象,它实现了远程对象向外暴露的接口,也就是说它的方法和远程对象暴露的方法的签名是相同的。客户端认为它是调用远程对象的方法,实际上是调用Stub对象中的方法。可以理解为Stub对象是远程对象在本地的一个代理,当客户端调用方法的时候,Stub对象会将通过网络传递给远程对象。

RMI

RMI调用流程:

  1. 客户端调用客户端辅助对象Stub上的方法;
  2. 客户端辅助对象Stub打包调用信息(变量,方法名),通过网络发送给服务器端辅助对象skeleton;
  3. 服务器辅助对象skeleton将客户端辅助对象发送过来的信息解包,找出真正被调用的方法以及该方法所在对象;
  4. 调用真正服务对象上的真正方法,并将结果返回给服务器端辅助对象skeleton;
  5. 服务器端辅助对象将结果打包,发送给客户端辅助对象Stub;
  6. 客户端辅助对象将返回值解包,返回给调用者;
  7. 客户获得返回值。

3.两者区别

1.方法调用方式不同

RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口(stub)上,那么这个新方法就不能被RMI客户方所调用。

RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和一个文本值,通常形成“classname.methodname(参数集)”的形式。RPC远程主机就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议发回。

2. 适用范围不同

RMI只用于Java;

RPC是网络服务协议,与操作系统和语言无关。

3.调用结果的返回形式不同:

Java是面向对象的,所以RMI的调用结果可以是对象类型或者基本数据类型;

RMI的结果统一由外部数据表示 (External Data Representation, XDR) 语言表示,这种语言抽象了字节序类和数据类型结构之间的差异。

Just Keep Going !