Java RMI与RPC,JMS的比较
RPC:(Remote Procedure Call)
被设计为在应用程序间通信的平台中立的方式,它不理会操作系统之间以及语言之间的差异。 支持多语言
RMI:(Remote Method Invocation)
RPC 的Java版本,EJB的基础技术
RMI 采用JRMP(Java Remote Method Protocol)通讯协议,是构建在TCP/IP协议上的一种远程调用方法。
RMI 采用stubs和skeletons来进行远程对象的通讯。
stub充当远程对象的客户端代理,有着和远程对象相同的远程接口。
远程对象的调用实际是通过调用该对象的客户端代理对象stub来完成的。
创建远程方法调用的5个步骤:
1)定义一个扩展了Remote接口的接口,该接口中的每一个方法必须声明它将产生一个RemoteException异常;
2)定义一个实现该接口的类;
3)使用rmic程序生成远程实现所需的存根和框架;
(例如,在demo.rmi.EchoServer.java所在目录运行: rmic demo.rmi.EchoServer)
4)创建一个客户程序和服务器进行RMI调用;
5)启动rmiregistry并运行自己的服务程序和客户程序。
RMI与RPC的区别在于:
1)方法是如何被调用的
对RMI来说,如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口上,那么这个新方法就不能被RMI客户方所调用。
而在RPC中,当一个请求到达RPC服务器时,请求包含一个参数集和一个文本值,通常为“classname.methodname”形式。
这表明,请求的方法在“classname”类中,名叫“methodname”。
然后,RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。
这里的参数类型是与RPC请求中的类型匹配的。 一旦匹配成功,方法就被调用了,其结果被编码后返回客户方。
2)对传递信息的限制
RMI 调用远程对象方法,允许方法返回 Java 对象以及基本数据类型。
而RPC不允许传递对象,RPC服务的消息由外部数据表示(External Data Representation,XDR)语言来表示。
另外,RMI优于RPC或SOAP的一点是:在程序开发过程中因为对象或方法不匹配造成的错误可以在编译期被发现,而不用等到运行期。
###########################
注:另一篇文章描述RPC与RMI的区别为:
RMI底层协议为TCP/IP;RPC底层协议为:UDP。
两个名词没有可比性,因为它们不是一类东西:
RMI是Sun公司定义的一个Java分布式框架,包括一些Java接口等;而RPC是一个网络协议。
http://kylinsoong.iteye.com/blog/801072
###########################
JMS:
JMS是java平台上的消息规范。一般JMS消息不是一个XML,而是一个Java对象。
JMS 与 RMI 的区别在于:
采用 JMS 服务,对象是在物理上被异步从网络的某个 JVM 上直接移动到另一个 JVM 上。
而 RMI 对象是绑定在本地 JVM 中,只有函数参数和返回值是通过网络传送的。
SOAP与JMS对比:
1)SOAP专注于远程服务调用,JMS专注于信息交换。
2)大多数情况下soap是两系统间的直接交互(Consumer <--> Producer),而大多数情况下JMS是三方系统交互(Consumer <- Broker -> Producer)。
当然,JMS也可以实现request-response模式的通信,只要Consumer或Producer其中一方兼任broker即可。
3)多数情况下,WS是同步的,JMS是异步。虽然,WS也可以是异步的,而JMS也可以是同步的。
参考文档:
http://visionsky.blog.51cto.com/733317/438693 (Java RMI与RPC,JMS的比较)
http://wenku.baidu.com/view/309850c66137ee06eff91892.html (RMI与RPC)
http://blog.csdn.net/yangdelong/article/details/4557512 (深入探讨SOAP、RPC和RMI)
http://www.blogjava.net/fanyingjie/archive/2011/09/24/359401.html (Java RPC通信机制之RMI,包括简单例子)
http://blog.csdn.net/arau_sh/article/details/6696178 (RPC,RMI,Web Services,JMS那点事)