关于RMI
1.简介
之前项目使用过RMI,借此机会学习一下
Java RMI(Java Remote Method Invocation):用于实现远程过程调用的应用程序编程接口;使客户机上运行的程序可以调用远程服务器上的对象,以便分布式操作,宗旨是尽可能简化远程接口对象的使用; Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径
Dubbo框架使用的RPC(Remote Procedure Call)也可以实现远程调用,RMI在RPC的基础上提供了分布式对象之间的通讯;允许运行在一个虚拟机的对象调用另一个虚拟机对象的方法;
2.原理
Stub和Skeleton:这两个的身份是一致的,都是作为代理的存在。客户端成为Stub,服务端的称作Skeleton.要做到对程序员屏蔽远程调用方法的细节,代理必不可少,包括网络连接等细节;
Registry:提供了服务名到服务的映射。
3.过程
RMI由三个部分构成,RMIService是JDK提供的一个可以独立运行的程序,自己编写的RMIServer和自己编写的RMIClient;
首先RMIService必须先启动并开始监听对应的端口.
其次,RMIServer将自己提供的服务的实现类注册到RMIService上,指定一个访问的路径
最后,RMIClient使用实现知道的路径到RMIServie上寻找这个服务,并使用这个服务在本地的接口调用服务方法;
4.问题
发现之前写的代码服务端的接口的具体实现类并没有继承UnicastRemoteObject基类,而是只实现了接口,而接口只继承了Remote;因为UnicastRemoteObject基类里的exportObject方法可以导出远程对象,所以lookup方法出来的对象类型是代理对象而不是对象本身;对于RMI来说,客户端调用的只应该是远程对象的存根对象,以便客户端在调用的时候保证调用的是远程对象而不是新对象,代码将执行在服务端而非客户端;
5.和RPC的对比
1.方法的调用方式不同:
RMI中是通过在客户端的stub对象作为远程接口进行远程方法调用.每个远程方法都具有方法签名.如果一个方法在服务器上执行,但是没有相匹配的签名被添加到代理远程接口上,则新方法不能被客户端调用;
RPC中是通过网络服务协议向远程主机发送请求,请求包含了一个参数集合一个文本值,通常形成”classname.methidname(参数集)”的形式。RPC元混成主机去搜索与之相匹配的类和方法,找到后就执行方法把结果编码通过网络协议发回。
2.使用语言范围不同
RMI只是java
RPC是网络服务协议,与操作系统和语言无关.
3.调用结果的返回形式不同
RMI的调用结果可以是对象类型或者是基本数据类型;统一由外部数据表示语言表示,这种语言抽象了字节序类和数据类型结构之间的差异;