[[268642]]
RMI的思路定义
RPC (Remote Procedure Call):远程方法调用,用于一个进程调用另一个进程中的远程过程,从而提供了过程的调用分布能力。
RMI(Remote Method Invocation):远程方法调用,详相即在RPC的解和基础上有向前迈进了一步,提供分布式对象间的思路通讯。允许运行在一个java 虚拟机的远程对象调用运行在另一个java虚拟机上对象的方法。这两个虚拟机可以是调用运行在相同计算机上的不同进程中,也可以是详相运行在网络上的不同计算机中。
RMI的解和全称宗旨就是尽量简化远程接口对象的调用。
RMI大大增强了java开发分布式应用的思路能力,例如可以将计算方法复杂的程序放在其他的服务器上,主服务器只需要去调用,而真正的运算是在其他服务器上进行,***将运算结果返回给主服务器,这样就减轻了主服务器的负担,提高了效率(但是也有其他的开销)。
RMI网络模型
在设计初始阶段,我们真正想要的是这样一种机制,客户端程序员以常规方式进行方法调用,而无需操心将数据发送到网络上或者解析响应之类的问题。所以才有了如下的网络模型:在客户端为远程对象安装一个代理。代理是位于客户端虚拟机中的一个对象,它对于客户端程序来说,就像是要访问的远程对象一样。客户端调用此代理时,只需进行常规的方法调用。而客户端代理则负责使用网络协议与服务器进行联系。
现在的问题在于代理之间是如何进行通信的?通常有三种方法:
1、CORBA:通过对象请求代理架构,支持任何编程语言编写的对象之间的方法调用。
2、SOAP
3、RMI:JAVA的远程方法调用技术,支持java的分布式对象之间的方法调用。
其中CORBA与SOAP都是完全独立于言语的,可以使用C、C++、JAVA来编写,而RMI只适用于JAVA。
RMI的工作原理
一、术语介绍
1、存根:当客户端要调用远程对象的一个方法时,实际上调用的是代理对象上的一个普通方法,我们称此代理对象为存根(stub)。存根位于客户端机器上,而非服务器上。
2、参数编组:存根会将远程方法所需的参数打包成一组字节,对参数编码的过程就称为参数编组。参数编组的目的是将参数转换成适合在虚拟机之间进行传递的格式,在RMI协议中,对象是使用序列化机制进行编码的。
二、编程模型
为了介绍RMI的编程模型,我下面会编写一个DEMO。远程对象表示的是一个仓库,而客户端程序向仓库询问某个产品的价格。
1、接口定义
远程对象的能力是由在客户端和服务器之间共享的接口所表示的:
远程对象的接口必须扩展Remote接口,它位于java.rmi包中。接口中所有的方法必须声明抛出RemoteException异常。这是因为远程方法总是存在失败的可能,所以java编程语言要求每一次远程方法的调用都必须捕获RemoteException,并且指明当调用不成功时应执行的相应处理操作。
2、接口的实现
你可以看出这个类是远程方法调用的目标,因为它扩展自UnicastRemoteObject,这个类的构造器使得它的对象可供远程访问。
3、RMI注册表:通过JNDI发布RMI服务
如:rmi://regserver.mycompany.cmo:99/central_warehouse
如果我们是在本地发布RMI服务,那么host就是“localhost”,此外RMI默认的端口号是“1099”,当然我们也可以自行设置,只要不与其他端口重复即可。 service实际上是基于同一个host与port下唯一的服务名。
发布RMI服务:
运行结果:
- Constructing server implementation
- Binding server implementation to registry
- Waiting for invocations from clients ...
4、调用RMI服务
运行结果:
- RMI registry binding:
- mate7:3700.0
5、下面我们来看下RMI的网络示意图:
RMI的局限性
(责任编辑:娱乐)
正业国际(03363.HK)全年纯利下降33.35% 每股基本盈利人民币11分
Xbox独占射击游戏《穿越火线X》5月停服 单人战役也受影响
*ST海航(600221.SH):2月客运量同比升419.17% 货邮载运率32.77%