发表于: 2017-07-26 22:14:52
1 902
今天完成的事情:理解RMI的原理起源
什么是RMI
RMI是Java的一组拥护开发分布式应用程序的API。RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。
Java远程方法协议(英语:Java Remote Method Protocol,JRMP)是特定于Java技术的、用于查找和引用远程对象的协议。这是运行在Java远程方法调用(RMI)之下、TCP/IP之上的线路层协议
通过RMI技术,本地虚拟机JVM可以调用存在于另外一个JVM中的对象方法,就好像该虚拟机调用存在于本地JVM的某个对象方法一样。而另外一个JVM可以与本地JVM在同一台物理机,也可以属于不同的物理机。
常见的可以实现远程调用的技术还包括了 RPC,CORBA,Web Service,这里不一一介绍,需要了解的同学可以 google,以下只关注 RMI 这个只针对 Java 语言的远程调用技术的一些阐述。
RMI技术变迁
RMI技术早在JDK1.1中就出现了,并且在JDK1.5版本做了重大改进,使得我们可以更加简单的使用RMI技术来支持分布式应用。关于详细的技术变更历史,可以参见官方的 Java RMI release Note。
RMI基本实现说明
我们希望在两个JVM虚拟机远程方法调用可以以常规方法进行调用,而无需关心数据的发送接收以及解析之类的问题。解决的思路是,在客户端安装一个代理(proxy),代理是位于客户端虚拟机中的一个对象,他对于客户端对象,看起来就像访问的远程对象一样,客户端代理会使用网络协议与服务器进行通信。同样的实现的服务端代码的程序员也不希望需要手动编码对客户端的调用进行复杂的处理,所以在服务器端也会有一个代理对象来进行通信的繁琐工作。
在RMI中,客户端的代理对象被称为存根(Stub),存根位于客户端机器上,它知道如何通过网络与服务器联系。存根会将远程方法所需的参数打包成一组字节。对参数编码的过程被称为参数编组(parameter marshalling),参数编组的目的是将参数转换成适合在虚拟机之间进行传递的形式。在RMI协议中,对象时使用序列化机制进行编码的。
总的来说,客户端的存根方法构造了一个信息块,它由以下几部分组成
1.被使用的远程对象的标识符
2.被调用的方法的描述
3.编组后的参数
然后,存根将此信息发送给服务器。在服务器的一端,接收器对象执行以下动作:
1.定位要调用的远程对象
2.调用所需的方法,并传递客户端提供的参数
3.捕获返回值或调用产生的异常。
4.将返回值编组,打包送回给客户端存根
客户端存根对来自服务器端的返回值或异常进行反编组,其结果就成为了调用存根返回值。
明天计划的事情:准备去看官方文档
遇到的问题:在两台不同的物理主机部署RMI程序时 ClassNotFoundException,还有RMI是否能够理解成为RPC框架的一种?以及他与RESTFUL API又是什么联系?
收获:了解RMI以及产生更多的疑问
评论