“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调用的过程大概有10步:
- 执行客户端调用语句,传送参数
- 调用本地系统发送网络消息
- 消息传送到远程主机
- 服务器得到消息并取得参数
- 根据调用请求以及参数执行远程过程(服务)
- 执行过程完毕,将结果返回服务器句柄
- 服务器句柄返回结果,调用远程主句的系统网络服务发送结果
- 消息传回本地主机
- 客户端句柄由本地主机的网络服务接收消息
- 客户端接收到调用语句返回的结果数据
RPC框架的实现思路:
- 通信模型:假设通信的为A机器与B机器,A与B之间有通信模型,在Java中一般基于BIO或NIO;
- 过程(服务)定位:使用给定的通信方式,与确定IP与端口及方法名称确定具体的过程和方法;
- 远程代理对象:本地调用的方法(服务)其实是远程方法的本地代理,因此可能需要一个远程代理对象,对于JAVA而言,远程代理对象可以使用JAVA的动态对象实现,封装了调用远程方法调用;
- 序列化,将对象名称、方法名称、参数等对象信息进行网络传输需要转换为二进制传输,这里可能需要不同的序列化技术方案。如:protobuf,Arvo等。
2.RMI简介
RMI(Remote Method Invocation, 远程方法调用)。能够让在客户端JAVA虚拟机上的对象像调用本地对象一样调用服务器端JAVA虚拟机中的对象上的方法。
实现原理 客户端只与代表远程主机中对象的Stub对象进行通信,丝毫不知道Server的存在。客户端只是调用Stub对象中的本地方法,Stub对象是一个本地对象,它实现了远程对象向外暴露的接口,也就是说它的方法和远程对象暴露的方法的签名是相同的。客户端认为它是调用远程对象的方法,实际上是调用Stub对象中的方法。可以理解为Stub对象是远程对象在本地的一个代理,当客户端调用方法的时候,Stub对象会将通过网络传递给远程对象。

RMI调用流程:
- 客户端调用客户端辅助对象Stub上的方法;
- 客户端辅助对象Stub打包调用信息(变量,方法名),通过网络发送给服务器端辅助对象skeleton;
- 服务器辅助对象skeleton将客户端辅助对象发送过来的信息解包,找出真正被调用的方法以及该方法所在对象;
- 调用真正服务对象上的真正方法,并将结果返回给服务器端辅助对象skeleton;
- 服务器端辅助对象将结果打包,发送给客户端辅助对象Stub;
- 客户端辅助对象将返回值解包,返回给调用者;
- 客户获得返回值。
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 !