JRMI |
Java RMI (Remote Method Invocation 远程方法调用)是用Java在JDK1.1中实现的,它大大增强了Java开发分布式应用的能力。Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发100%纯Java的网络分布式应用系统的核心解决方案之一。其实它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
RMI目前使用Java远程消息交换协议JRMP(Java Remote Messaging Protocol)进行通信。JRMP是专为Java的远程对象制定的协议。因此,Java RMI具有Java的"Write Once,Run Anywhere"的优点,是分布式应用系统的百分之百纯Java解决方案。用Java RMI开发的应用系统可以部署在任何支持JRE(Java Run Environment Java,运行环境)的平台上。但由于JRMP是专为Java对象制定的,因此,RMI对于用非Java语言开发的应用系统的支持不足。不能与用非Java语言书写的对象进行通信。
RMI-IIOP出现以前,只有RMI和CORBA两种选择来进行分布式程序设计。RMI-IIOP综合了RMI和CORBA的优点,克服了他们的缺点,使得程序员能更方便的编写分布式程序设计,实现分布式计算,RMI和CORBA范型现在也开始相互融合。
RMI是一个分布式对象模式。由于不需要设计协议使得使用RMI开发分布式程序比使用socket更加容易。在RMI里,设计者就象在调用一个本地类的方法一样,而实际上是在调用的时候相应的参数被发送到远端的对象后被解释,最后结果返回给调用者 |
我个人认为像上边提到的,RMI,有时作为协议提出来,有时作为一种分布式解决方案/框架提出。
RPC(远程方法调用)是RMI的概念先驱,好象是RMI的爹一样。RPC的Java版本的儿子就叫RMI,当然儿子有很大不同与RPC。
RMI是一个纯的分布式对象通信模型,是Sun一手精心打造的。
关于RMI和Corba我想是否有下列的比较关系?
框架? |
基本组件模型 |
通信协议 |
接口描述 |
服务发现方法 |
JRMI |
RMI组件 |
JRMP |
java |
RMI/JRMP查找 |
IIOP |
RMI/IIOP查找 |
J2EE |
EJB |
RMI |
java |
JNDI |
CORBA |
CCM |
GIOP/IIOP |
IDL |
CosNaming查找 |
RMI自Java诞生起,Java远程方法激发(JRMI)框架就成为Java的分布式通信框架。再随后由于J2EE的迅速发展,EJB获得了巨大成功,但EJB框架是架构于JRMI之上,比如这样说,J2EE/EJB是用JRMI进行成功开发的一个例子,更好理解的是,任一个EJB的java文件必定有import java.rmi.*;
与一般普通的RMI文件比,不过更加限制死了格式。
|
|
CORBA |
CORBA(The Common Object Request Broker Architecture:通用对象请求代理结构)是对象管理组织(ORG)在分布式对象项目方面资助的一个工业标准。CORBA只是一个标准,一个CORBA服务以ORB(Object Request Broker对象要求代理)的形式来运行,市场上有很多可用的CORBA ORB服务软件例如VisiBroker, ORBIX, 和其他一些ORB软件。JavaIDL 是其中的一个,它是jdk1.3或jdk1.3以上版本的一个核心开发包。
CORBA的设计是独立于平台和语言的,因此CORBA可以在任何平台上运行,可以定位在网络的任何地方,能够使用任何有IDL(Interface Definition Language )映射的语言。和RMI相类似,CORBA对象使用接口来描述,然而接口在CORBA中是定义在IDL中的。
不过CORBA本身有两层含义:既是一种组件模型标准,也是分布式应用服务标准,是一个框架。
|
CORBA与RMI的比较 |
从编码的角度看,很明显RMI更易于使用,因为Java开发者不需要熟悉接口定义语言(IDL)。但是总的说来,CORBA在以下方面与RMI有所不同:
-
CORBA接口用IDL定义,RMI接口用Java定义。RMI-IIOP允许你用Java定义
所有接口(请参见 RMI-IIOP)。
-
CORBA支持in 和out 参数,而RMI不支持,因为
本地对象是通过复制传送的,远程对象是通过引用传送的。
-
CORBA被特意设计成与语言不相关。举例来说,这意味着可以用Java编写一些对象,用C++编写其他对象,而它们仍然可以协同工作。所以,作为不同编程
语言间的桥梁,CORBA是一种理想机制。与此不同,RMI为一种单独的语言设计,
所有对象都可用Java编写。但是请注意,用RMI-IIOP有可能达到协同工作的能
力。
-
CORBA对象不能进行碎片收集。正如我们前面说的,CORBA与语言无关,某
些语言(比如C++)不支持碎片收集。可以认为这是项缺点,因为CORBA对象一
旦创建,就一直存在,直至被除去为止,而决定何时除去一个对象的工作量可不小。与此相反,RMI对象会自动收集碎片。
结论:
开发基于分布式对象的应用程序可以在Java中用RMI或JavaIDL(CORBA的一个实现)完成。这两种技术的用法类似,第一步都是定义对象的接口。但是与RMI
用Java定义接口不同,CORBA接口是用接口定义语言(IDL)定义的。可是这就多了一层复杂度,开发者需要熟悉IDL,同样重要的是,还要熟悉它到Java的映射。 |
|
GIOP和IIOP |
GIOP:通用 ORB 间协议 (GIOP) 用来为这个由不同计算机及其各种体系结构组成的凌乱世界中传送消息定义结构和格式。如果使用 GIOP 的结构和格式,并将它们应用于 TCP/IP,那么就得到 IIOP。GIOP定义了一种途径把已编码的IDL数据映射为通过线路发送的二进制数据流。
IIOP=GIOP+TCP/IP。IIOP把GIOP消息数据映射为TCP/IP连接行为。GIOP 是 CORBA 方法调用的核心部分。GIOP 不基于任何特别的网络协议,如 IPX 或 TCP/IP。为了确保互操作性,OMG 必须将 GIOP 定义在所有供应商都支持的特定传输之上。如果有详细和简洁的消息规范,则不会提供互操作性,因为所有供应商使用不同的传送机制来实现这个互操作性。因此,OMG 在最广泛使用的通信传输平台 -- TCP/IP 上标准化GIOP。GIOP 加 TCP/IP 等于 IIOP!就这么简单。
参考链接:
1、接触
CORBA 内幕:IOR、GIOP 和 IIOP。
|
|
CCM |
直到1999,仅有两种server-side
transaction processing-oriented 组件模型:MTS/COM+
model and Sun's EJB model。
直到1999年底,CORBA(语言中性、平台无关、发行商中性,可谓分布式对象计算中间件的典范,)3.0提出了第三种server-side
组件模型:CCM。
CCM使用CORBA对象模型作为底层的对象互操作框架,从而不局限于特定的编程语言。
参考链接:
1、CCM
简介 |
|
Visibroker |
Inprise公司(http://www.inprise.com):前身是由大名鼎鼎的Borland公司和Visigenic公司合并后成立的一家公司。Visigenic为Java
Orb产品创建了Visibroker。某种程度上讲VisiBroker已经成为事实上的CORBA解决方案。
VisiBroker为构建、分发及管理分布式Java和C++对象提供了完整的CORBA ORBTM环境。利用IIOP的原生实现,VisiBroker构造了一个在Internet、Intranet和基于Web计算的工业标准协议。VisiBroker是CORBA开发的优先选择。由于能够和先进的Java和C++开发环境互操作,VisiBroker强大的开发能力使关键任务应用的开发更容易、全面,降低了开发风险。
当然,还由很多的Corba产品供应商,如Sun中提供了Java
IDL,Iona公司的OrbixWeb。
产品列表链接:
1、CORBA产品 |
|
JRMP RMI-JRMP |
JRMP是一个十分简单的操作于TCP/IP之上的Sun专用的有线传输协议。
Java远程消息协议:JRMP是一个由SUN公司开发的协议,主要用于传输Java的远程方法(过程调用),它的作用和IIOP差不多,但支持对象的传输,SUN希望JRMP成为用户的另一种选择。它是一个非标准的协议,不允许使用交叉语言编写的Corba对象之间进行通讯。 |
|
RMI-IIOP |
- RMI-IIOP 兼有 CORBA 的强度和 RMI
的灵活性。
- 开发者很容易就可以使用
RMI-IIOP,RMI-IIOP
也易于集成到多数企业基础架构中。
RMI-IIOP 很强大的功能之一是,它让您编写纯 Java 客户机/服务器实现而不丧失 RMI 类序列化的灵活性。RMI-IIOP 通过覆盖 Java 序列化并在导线上将 Java 类转换成 IIOP 做到这一点。在另一端,Java 类被作为 IIOP 从导线上读下来,接着创建这个类的一个新实例(使用反射),类的所有成员的值都完整无缺 — 瞧:这就是 IIOP 上的 Java 序列化!
举例说明RMI-JRMP与RMI-IIOP在写RMI服务器端代码不同支出:
1、RMI-JRMP的服务器扩展java.rmi.server.UnicastRemoteObject.
RMI-IIOP的服务器扩展javax.rmi.PortableRemoteObject
2、用rmic编译的时候如果是IIOP就 加上 -iiop的参数。
javax.rmi.CORBA.* 包含了实现和使用RMI/IIOP对象所需要的所有的CORBA相关的类和接口。
参考链接:
1、对在 IIOP 上运行 RMI 的介绍 |
|