远程方法调用RMI详细,与RPC非常相似

发布者:上海IT外包来源:http://www.lanmon.net点击数:1122

RMI定义
RPC(远程过程调用):远程方法调用,由一个进程用于调用另一个进程中的进程,从而提供进程的分发能力。
RMI(远程方法调用):远程方法调用,它是RPC的一个进步,提供分布式对象之间的通信。允许在java虚拟机中运行的对象调用在另一个Java虚拟机上运行对象的方法。这两个虚拟机可以在同一台计算机上运行的不同进程中运行,也可以在网络上运行的不同计算机上运行。
RMI的全称是为了简化远程接口对象的调用。
RMI极大地增强了Java开发分布式应用程序的能力。例如,具有复杂计算方法的程序可以放在其他服务器上。只需要调用主服务器,在其他服务器上执行实际操作,最后返回操作结果。给主服务器,这可以减轻主服务器的负担并提高效率(但还有其他开销)。
RMI网络模型
在设计的初始阶段,我们真正想要的是一种机制,客户端程序员以通常的方式进行方法调用,而不必担心将数据发送到网络或解析响应。因此,可以使用以下网络模型:在客户端安装远程对象的代理。代理是位于客户端虚拟机中的对象,类似于客户端程序要访问的远程对象。当客户端调用此代理时,它只需要进行常规方法调用。客户端代理负责使用网络协议联系服务器。
远程方法调用RMI详细,与RPC非常相似
现在的问题是代理商如何相互沟通?通常有三种方式:
1. CORBA:支持通过对象请求代理体系结构以任何编程语言编写的对象之间的方法调用。
2,SOAP
3,RMI:JAVA的远程方法调用技术,支持Java分布式对象之间的方法调用。
CORBA和SOAP完全独立于语言,可以用C,C ++,JAVA编写,而RMI只适用于JAVA。
RMI如何工作
一,术语介绍
1.存根:当客户端想要调用远程对象的方法时,它实际上在代理对象上调用普通方法。我们将此代理对象称为存根。存根位于客户端计算机上,而不是服务器上。2.参数分组:存根将远程方法所需的参数打包成一组字节。编码参数的过程称为参数分组。参数分组的目的是将参数转换为适合在虚拟机之间传递的格式。在RMI协议中,使用序列化机制对对象进行编码。
二,编程模型
为了介绍RMI编程模型,我将在下面编写一个DEMO。远程对象表示存储库,客户端程序向仓库询问产品的价格。
1,界面定义
远程对象的功能由客户端和服务器之间共享的接口表示:
远程方法调用RMI详细,与RPC非常相似
远程对象的接口必须扩展Remote接口,该接口位于java.rmi包中。接口中的所有方法都必须声明RemoteException异常。这是因为远程方法总是有失败的可能性,因此Java编程语言要求每个远程方法调用必须捕获RemoteException并指示在调用不成功时应执行的相应处理。
2,实现界面
远程方法调用RMI详细,与RPC非常相似
您可以看到此类是远程方法调用的目标,因为它从UnicastRemoteObject扩展,此类的构造函数使其对象可用于远程访问。
3,RMI注册表:通过JNDI发布RMI服务
要访问服务器上的远程对象,客户端必须首先获取本地存根对象,该对象是客户端计算机上的代理对象。然后问题即将到来,我怎么能得到这个存根?
为此,JDK提供了引导注册表服务,并且服务器程序应该使用引导注册表来注册至少一个远程对象。
要注册远程对象,您需要一个RMI URL和对实现对象的引用。
RMI URL以rmi:开头,后跟域名或IP地址(主机),后跟端口号(端口),最后是服务名称(服务)。
如:rmi: //regserver.mycompany.cmo: 99/central_warehouse
如果我们在本地发布RMI服务,则主机为“localhost”,并且RMI的默认端口号为“1099”。当然,我们也可以自己设置,只要它不与其他端口重叠。该服务实际上基于同一主机和端口下的唯一服务名称。
发布RMI服务:
远程方法调用RMI详细,与RPC非常相似操作结果:
构建服务器实现
将服务器实现绑定到注册表
等待客户的调用..
第20行只是创建一个注册表并在JNDI中创建一个注册表。
第21行通过bind方法将RMI地址绑定到RMI服务实现类。
执行此方法后,它相当于自动发布RMI服务。接下来要做的是编写一个RM客户端来调用已发布的RMI服务。
4,调用RMI服务
远程方法调用RMI详细,与RPC非常相似
操作结果:
RMI注册表绑定:
Mate7: 3700.0
服务调用只需要知道两件事:1。RMI请求路径; 2. RMI接口名称
在第15行,这里是接口名称Warehouse,而不是实现类。不能是RMI接口的实现类,否则在本地调用。
查看运行结果,我们知道此DEMO演示的远程调用是成功的。
5,下面我们来看看RMI的网络图:
远程方法调用RMI详细,与RPC非常相似
通过JNDI的所谓命名和目录服务,我们成功发布并调用了RMI服务。实际上,JNDI是一个注册表,服务器将服务对象放入注册表,客户端从注册表获取服务对象。
在服务器端,我们发布了RMI服务并在JNDI中注册了它。此时,我们在服务器端创建了一个Skeleton。当客户端第一次成功连接到JNDI并获取远程服务对象时,它就是本地的。创建了一个存根。
远程通信实际上是通过Skeleton和Stub完成的,数据是根据TCP/IP协议在“传输层”上发送的。
毫无疑问,理论上RMI必须比WebService更快。毕竟,WebService基于http协议,http携带的数据通过“应用层”传输。传输层低于应用层,底层更快。
RMI的局限性
只能实现JAVA系统之间的调用,并且WebService可以跨语言实现系统之间的调用。
RMI使用JAVA的默认序列化方法。对于具有更高性能要求的系统,可能需要其他序列化方案。
RMI服务在运行期间将不可避免地失败。例如,如果无法连接RMI服务,则客户端将无法响应。
IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部