返回首页

RMI-CORBA 分布式运算RMI、CORBA探讨
 
 

前言:
    作为软件应用的开发人员来说,一般都从入门的从基层的程序员做起,比如仅仅是编程,或做界面,做服务器端的代码,或写一些class,设计一些接口,查询模块、事物处理模块,如果想在软件项目开发技术层次更上一层楼的话,对分布式运算的了解和运用就是一个必经之路。
    当我们在积累的一定的项目开发经验或熟练操纵某一门语言或某几门语言后,甚至我们已经熟练的在从事EJB、Corba开发的工作后,我们需要来完整的整理一下思路,探讨有关分布式运算的来龙去脉,毕竟在这个领域,名词格外的的繁多,如RMI、CORBA、IIOP、JRMP、EJB、J2EE、COM\DOCM、RPC、IDL等等,这些对于一个新手来说,甚为棘手,就是对多数熟练在某一领域的开发老鸟来说,有时也常常为其困惑。本人水平很凹,只有从网上搜索的大批的资料并结合个人的经验来做个分析,希望能对那些对分布式运算有兴趣的人有所帮助。
    再次注明,这里的资料多是从网上下载而来。

 
 

首先看一个网友的总结表格:
服务框架 基本组件模型 通信协议 接口描述 服务发现方法
CORBA CORBA组件 IIOP IDL CORBA发现服务
J2EE EJB RMI JAVA JNDI
COM+ COM/DCOM ORPC MIDL 注册表
Web Service框架 Web Service SOAP WSDL UDDI

一些网友的追加注释:
1、在基本组件模型那一栏,Web Service是没有的,Web Service仅仅是Interface,而 Implementation 则恰恰是这一列中上面三个:Corba组件/EJB/COM
2、由于SOAP使用XML作为封装和交换信息的标准,因此可以在不同的平台中使用,只要不同的平台支持并且能够解析和处理SOAP的包,由于SOAP本身只是一个定义如何交换数据的Wire  Protocol,因此他可以使用现有的任何的标准通信协议作为实体沟通的机制。现有的SOAP规范中选择使用HTTP通信协议作为通信协议,这样SOAP封装的消息可以通过HTTP进行传输,当然除了HTTP外,还可以使用SMTP,IIOP。
    从CORBA来说,它也在进行与Web服务的交互。它发布了一个文档“CORBA Web Services”里面的内容包括 CORBA/SOAP语言绑定,互操作交互模型,IDL--XML Schema映射,IDL--WSDL映射,WSDL--CORBA映射等。还有一个“WSDL-SOAP to CORBA Interworkind Request For Proposal”的文档也描述了相关内容,可以参看www.omg.org相关文档。


另外,关于一些名词的解释如下:
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支持inout参数,而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 的介绍

 

 
 

    由于对微软的DOM模型不是很熟悉,所以就不献丑探讨了。SOAP,一种新的框架胶水,也只是有点了解,也不讨论了。

 
 

参考书籍:
1、J2EE构建企业系统-专家级解决方案。(Paul J.Perrone,et al著)

 
 
 
 
 
联系方法

 
 
 
 

返回首页