CORBA(Common ObjectRequest Broker Architecture公共对象请求代理体系结构)是由
OMG组织制订的一种标准的
面向对象应用程序体系规范。或者说CORBA体系结构是对象管理组织(OMG)为解决
分布式处理环境(DCE)中,硬件和软件系统的互连而提出的一种解决方案;OMG组织是一个国际性的
非盈利组织,其职责是为
应用开发提供一个公共框架,制订工业指南和对象管理规范,加快对象技术的发展。
技术介绍
CORBA是OMG组织在1991年提出的公用对象请求代理程序结构的
技术规范。CORBA有很广泛的应用,它易于集成各厂商的不同计算机,从大型机一直到微型内嵌式系统的终端桌面,是针对大中型企业应用的优秀的中间件。最重要的是,它使服务器真正能够实现高速度、高稳定性处理大量用户的访问。现在很多大型网站后端的服务器都运行CORBA,其中有些网站您可能每天都在访问。
CORBA的底层结构是基于
面向对象模型的,由OMG接口描述语言(OMG Interface Definition Language,OMG IDL)、对象请求代理(Object Request Broker,ORB)和IIOP标准协议(Internet Inter ORB Protocol,也称网络ORB交换协议)3个关键模块组成。
使用接口描述语言编写的对象接口,使得与语言无关的独立性成为可能。IDL使得所有CORBA对象以一种方式被描述,仅仅需要一个由本地语言(C/C++、CORBA或Java)到IDL的“桥梁”。CORBA对象的互通信要以对象请求代理为中介,这种互通信可以在多种流行通信协议(如TCP/IP或IPX/SPX)之上实现。在TCP/IP上,来自于不同开发商的ORB用IIOP标准协议进行通讯。
我们知道,为了保持CORBA的商业中立性和语言中立性,必须有一个中介,存在于像C++CORBA服务器代码和JavaCORBA客户机这样的实体中间,这就是IDL。一个底层对象的若干相关方法和属性被IDL集入一个单一接口。一旦IDL接口定义完成,它可以以Stub码或框架代码的形式编译成所选用的语言。在所有的ORB中都有IDL编译器。
值得注意的一点是,IDL不同于其他的面向对象程序设计语言,我们不能用它指定所定义的类或方法的具体实现。因此,仅仅将它作为一种定义底层对象接口的语言要好得多。
基本构件
CORBA结构示意图如图1所示。
公共设施
公共设施分为两类:
对象服务
对象服务是为公共设施和各种应用对象提供的基本服务,如命名服务、事件服务、事务处理服务、通知服务、交易服务、生命周期服务和安全服务等等。
应用对象
这是未经OMG标准化的、由各个应用开发者自行开发的实体,应用对象使用CORBA提供的各种对象服务。
对象请求代理
对象请求代理(ORB: Object Request Broker),它是CORBA的基础,是在分布环境下,CORBA应用所使用的、基于对象模型的软件总线。它的基本职责是解决对象引用的请求和建立应用对象之间的联结,通过标准接口,使这种联结独立于所使用的硬件和软件的平台,从而保证了对平台的透明性以及对操作系统、网络协议和编程语言的透明性。
接口定义语言
接口定义语言(Interface Definition Language,IDL)用来定义CORBA对象使用的、应用组件之间的接口。它不是过程语言,它只能定义接口,而不是去实现某个接口。IDL独立于任何编程语言,用IDL编译器可以将它映射为其他常用的语言,如C++,C,COBOL,Java等等。
IDL的框架主要包括四种元素:
核心作用
对象的定位
当客户端程序得到对象引用(Object Reference)之后,会调用该对象引用的操作。这时,客户端的ORB会根据对象引用中的信息来定位对象的实现(具体定位的方法将在后面章节讨论),并确保该对象实现可以接受请求。由于ORB可以根据对象引用来定位服务器,因此客户端程序不必关心对象是在哪里实现的。客户端对远端对象发起调用,就好像调用本地对象一样,从而实现了CORBA的位置透明的特性。
编组与解组
在客户端发起调用的时候,输入参数格式都与特定平台和特定语言有关,客户端ORB负责将它们编码成可以在网络上传送的格式,或称在线格式(on-wire format),这一过程称为编组(marshalling)。这种“0101”的格式在网络上传送后到达服务器端的ORB,服务器端的ORB负责将这些在线格式“还原”成本地所使用的特定平台和语言的格式,这一过程称为解组(unmarshalling)。与此相反,当服务器端调用结束以后,服务器端ORB负责将输出参数和返回参数编码成在线格式,并经网络传送到客户端ORB,客户端ORB再将这些在线格式“还原”成本地所使用的特定平台和语言的格式,作为输出参数和返回参数送给客户端程序。总的来说,编组与解组的重要性表现在:第一,它把对远端对象的调用变成一维的有序码流,有利于在网络上的传送。第二,它提供了一个独立于各平台和语言的“中间格式”,不同的平台上的不同语言通过这个“中间格式”进行“对话”“(中间格式”的规则,将在后面章节中叙述)。正是由于编组和解组的引入,使客户端和服务器端的平台和语言可以不同,带来了CORBA的平台独立与语言独立的特性。
初始服务
在程序初启的时候,需要得到一些通用的对象引用,如对象适配器、命名服务、接口库的对象引用。由于处于程序初启的特殊阶段,这些对象引用很难用常规的方法得到。ORB可以通过伪对象接口CORBA∷ORB提供两个操作以完成这项功能:list-initial-services()和resolve-initial-references()(详见“ORB初始化”一节)。
屏蔽协议
ORB负责处理底层网络通信的细节,它可以使用不同的底层网络协议,例如TCP/IP,IPX,SS7等,从而将客户与服务器从复杂的网络编程中解脱出来。
提供接口库
每个ORB都有一个接口库,接口库负责存储用接口定义语言(IDL)定义的接口的信息,它还支持一些标准的API,用来遍历或查询系统中的接口信息,它是CORBA动态调用不可缺少的组成部分。此外,ORB还通过伪对象接口CORBA∷ORB提供其他的通用API,这部分API既可以为客户程序使用,也可以由服务器程序使用(有关这部分的内容,将在“ORB接口”一节详细介绍)。基于以上的讨论,可将ORB核心的作用归纳如下(见图2):
工作方式
静态方式
为了更好地理解CORBA的工作方式,我们先看一个杜撰的比喻。
假设有一个国王,身边有一群所谓的学者,如哲学家、数学家、神学家等等。实际上他们并没有什么知识,唯一的法宝就是每人都有一张神奇的“名片”,能帮助他们找到真正的答案。(参阅图3所示的过程)。
有一天,国王突然对哲学发生了兴趣,他找来最赏识的哲学家,向他提了一个问题(见图3中①)。
哲学家对这个问题一窍不通,于是他按照“名片”上的信息打了一个电话,电话通往一个遥远的国度(见图3中②)。接电话的是一位哲学家的伙伴,其实他什么也不懂,但他是一位真正“先知”的私人代表,他把这个问题转达给了他的主人———那位隐居的“先知”(见图3中③)。
那位先知思考后,对问题作了详尽的回答(见图3中④)。
哲学家的伙伴对着话筒转达了全部的内容(见图3中⑤)。
第二天,哲学家对国王宣布了这个答案(见图3中⑥)。
如果把打电话改为写信,那么这个杜撰的情节几千年前就可能发生,其实,CORBA在“情节”上并不比它复杂。
那位国王就是客户(client),他的哲学家就是码根(stub),其它的“学者”们也都是码根,只不过各自对应的接口(能解决的问题)不同。国王询问哲学家,就是客户调用码根,那张神奇的“名片”就是对象引用(Object Reference),而负责通信的电话机就是ORB核心。哲学家根据名片,通过电话找到的那位哲学家伙伴就是静态框架(skeleton),而情节中那位隐居的“先知”,就是对象实现(Object Implementation)。
问题被一步步的传递,就是请求的过程,哲学家的伙伴接电话,就是接受请求的过程。先知在思考的时候,就是请求被执行的过程,答案被一步步传递,就是返回结果的过程。
在静态方式中,码根事先由IDL接口文件编译生成,它包括代理对象的定义和实现。代理对象的定义与IDL接口中的定义相一致,包括名字、操作、参数等等方面,代理对象的实现封装在代理对象内部,它实际上并没有执行客户所期待的实现,而是把客户的请求编组后交给ORB核心,等待远端的对象实现执行这一操作。执行后得到的返回参数和结果将通过ORB核心传回给码根进行解组,然后由码根以本地操作的方式把返回参数和结果送回给等待结果的客户端程序。
客户端程序通过对象引用直接调用码根中定义的各项操作。在静态方式中,框架事先由IDL接口文件编译生成,特定的框架接受特定的、对某个接口的请求。
动态方式
假设上面杜撰的情节发生了变化,国王新聘请了一位秘书,每当遇到问题,身边又没有一位学者可以“解答”时,国王就从名片簿中挑出一张他认为可以解决这个问题的专家的名片,将它递给秘书,秘书并不宣称自己是某个问题的专家,其工作只是按照国王的旨意,根据名片的内容给对方打电话,并将获得的解答告诉国王。
这就是动态调用方式,那位全能的秘书就是DII,而存放名片信息的名片簿就是接口库。
相对静态方式而言,动态方式有以下几个优点:
然而,与静态方式相比,动态方式有以下的缺点:
上述动态方式与静态方式的速度比较,只是定性的,其定量的比较,在很大程度上依赖于具体ORB的实现,在《Instant CORBA》一书中,作者实验的结论是,动态方式大约比静态方式慢40倍。因此,程序员在考虑采用动态方式之前,应适当平衡其对灵活性和速度的要求。通常,在客户端频繁地调用服务器对象,且服务器对象无变化的情况下,可以使用静态预编译码根的方式;而当客户端很少调用服务器对象,或者客户端在运行时发现服务器对象时,可以考虑使用动态调用方式。在同一个程序中,可以既使用动态方式,又使用静态方式,如图4所示。
应用
电信领域应用-TMN
TMN(
电信管理网),随着网络信息技术的飞速发展,网络设备日趋先进,网络业务日趋丰富,网络结构日趋复杂,这一切都需要一个智能化的网络管理系统来加以管理。
不同的国际组织和论坛制定了许多网络管理方面的标准和规范,例如ITU-T(国际电联)制定的用于电信网络管理的TMN,IETF制定的用于Internet网络管理的
SNMP协议,W3C制定的用于计算机桌面管理的WBEM,等等。TMN标准由一组协议文档组成,主要包括ITU-TX.700系列和ITU-TM.3100系列建议,它涵盖了电信管理网的体系结构、功能需求、信息模型、协议、一致性和方法学等诸多方面。它实际上是由ITU-TStudyGroup7和ISO(
国际标准化组织)最早于1988年共同制定的,此后经历了多次的修订和完善。TMN不仅用于管理OSI(开放系统互联)协议,也用于管理整个网络。