CORBA2015年春4.CORBACommonObjectRequestBrokerArchitecture公用对象请求代理程序体系结构4.1概述•CORBA是一个分布式的面向对象应用架构规范,它定义了分布式对象如何实现互操作,它是由OMG研究组在80年代末提出,在90年代逐步完善,形成现在被软件行业普遍认可的标准——CORBA/IIOP规范2.3。CORBA的开发者OMG最初由3Com、AmericanAirlines、Canon、DataGeneral、Hewlett-Packard、Philips、Sun和Unisys等八家公司在1989年组建,专门从事公共软件平台的研究和行业标准的制订,目前已经有800多个成员单位加入OMGCORBA的产生•CORBA的产生有其特定的背景,它是在面向对象的技术兴起,客户/服务器模式普遍得到应用的前提下,为屏蔽通信和实现细节的需求,继承已有系统,消除“孤岛”现象而产生的。•CORBA是一个中间件规范并不是一个实体软件。软件开发者通过使用第三方的ORB工具或IDL语言来定义CORBA对象,实现ORB功能。•传统的分布式系统交互:–C/S结构,紧耦合方式–编程双方会有影响•ODP的提出(ITU-TX.900)–多种透明性:访问、位置、移植、事务等。•软件中间件的提出:–C/S三层结构,松耦合,应用程序不关心底层通信CORBA的产生•最初,OMG在1990年制订了对象管理体系(ObjectManagementArchitecture),即OMA,来描述应用程序如何实现互操作。作为其中的一部分,需要有一个标准规范应用程序片段即对象的互操作──这导致了CORBA的诞生。CORBA的发展历程4.2CORBA体系结构•对象请求代理ORB•接口调用语言IDL•动态调用接口DII•接口仓库IR•对象引用和对象适配器OA•CORBA的核心是对象请求代理——ORB(ObjectRequestBroker),它提供了网络环境无关性、操作系统无关性和开发语言无关性的公共平台。•ORB提供以下透明机制:–对象位置透明:客户端不需要知道目标对象的位置,它可以是在网络的另一台机器上或者属于同一台机器的不同或相同的进程。–对象实现透明:客户端不需要知道目标对象的具体的编程语言,其使用的操作系统及硬件平台。4.2.1ORB–对象运行状态透明:客户端向目标对象发送请求时不需要知道目标对象的运行状态,如果有必要,ORB会将其自动激活,然后再把请求发送给它。–通信机制透明:客户端不需要了解ORB所使用的通信机制,所有调用都可以遵循统一的方式进行。•ORB并不一定必须是独立的进程。它是一个功能实体,在实现中可以是客户端或服务器的一部分。•ORB是一个中间件,他在对象间建立客户-服务器的关系。通过ORB,一个客户可以很简单地使用服务器对象的方法而不论服务器是在同一机器上还是通过一个网络访问。ORB截获调用然后负责找到一个对象实现这个请求,传递参数和方法,最后返回结果。客户不用知道对象在哪里,是什么语言实现的,他的操作系统以及其他和对象接口无关的东西。CORBA对象请求代理结构•CORBA结构和其计算模型有以下两点值得注意:•客户和对象实现通过IDL接口与ORB分隔;•所有的请求都由ORB管理,每次对CORBA对象的调用都需要经过ORB。客户机ORB对象实现IDLIDL客户机ORB对象实现IDLIDL网络ORB•OMA最重要的部分就是ORB。为了创建一个遵从CORBA规范的应用程序,ORB是CORBA四大部分中唯一必须提供的。许多ORB版本根本不CORBAServices或是CORBAFacilities,你可以自制(或购买)商用对象。但是,没有ORB,CORBA应用程序决对无法工作。CORBAORB最显见的功能,是对你的应用程序或是其它ORB的请求予以响应。在CORBA应用程序运行期间,你的ORB可能被请求做许多不同的事情,包括:ORB的功能•(1)查找并调用远程计算机上的对象•(2)负责不同编程语言之间的参数转换(如C++到Java)•(3)可超越本机界限的安全管理•(4)为其它的ORB收集并发布本地对象的metadata(元数据)•(5)用下载的代码(stub)中描述的静态方法调用去激活远程对象中的方法•(6)用动态方法调用激活远程对象•(7)自动激活一个当前没有装入内存运行的对象。ORB的功能•(8)将回调方法导引向其管理之下的本地对象•(9)实现细节对软件开发者的透明性,是ORB的一个杰出的特性。用户只须在代码中提供相应的hooks,用于初始化ORB并向ORB登记该应用程序,就可以将该应用程序和大量分布式对象建立联系。CORBA中两种不同的调用方式•CORBA允许用户以两种不同的方式提出对象请求:1)静态调用:通过给定接口的存根,在编译了对象代码后,进入客户端的程序。因此,静态调用必须在编译时就知道对象及其类型。2)动态调用:通过ORB的动态调用接口DII,在运行时生成访问对象的代码。不管客户以哪一种形式提出请求,ORB的任务是:找出所要对象的位置,激活该对象,向对象传递此请求。对象执行所请求的服务后,把输出值返回给ORB,然后再由ORB返回给客户。不同厂商和不同ORB•不同厂商的ORB中运行的对象能否与在其他ORB中运行的对象进行通信?•所有兼容CORBA2.0(或更高版本)的ORB都能够通过IIOP协议(internetinter–ORBProtocol)来相互操作。4.2.2IDL•为了保持CORBA的商业中立性和语言中立性,必须有一个中介,存在于象C++CORBA服务器代码和JavaCORBA客户机这样的实体之间。这就是IDL。虽然CORBA本身不是一门语言,但是它引入了一门新的语言。CORBA服务由模式(schema)来描述,而模式是对象可用方法的模版。这样的模式由IDL(InterfaceDefiniyionLanguage,接口定义语言)表示。和java一样支持CORBA的语言可以实现IDL模式,从而让其他软件可以调用方法。IDL语言是中立的,因此可以利用任何已经作了IDL映射的程序设计语言。•IDL(InterfaceDefinitionLanguage)是一种描述性语言而不是程序设计语言,只描述接口和相关的数据类型,不描述实现。•IDL独立于编程语言,但可以映射为多种编程语言,目前有如下6种:C,C++,JAVA,Ada,Cobol,SmallTalk•应用时由IDL编译器来实现从IDL语言到具体编程语言的映射。4.2.3DII•把IDL说明编译成面向对象程序设计语言的实代码后,客户可以调用已知对象的操作。在某些应用中,用户并不了解应用接口编译信息,但也要求调用对象的操作,这时就要动态调用接口来调用用户的操作了。例如,图形用户接口应支持用户浏览接口公共库,以获得每个对象所支持的操作信息,用户可根据自己的需求从浏览对象中挑选出所需的对象操作,具体的对象操作的调用实际上是用动态调用接口来完成的。•CORBA支持动态和静态调用接口•静态调用接口是在编译期间确定的•动态调用接口可以允许客户应用程序在不知道编译时对象类型的情况下,使用该服务器对象。4.2.4IR•接口仓库持久地存储IDL的接口说明,借助于接口仓库,可以实现对象继承性层次结构的导航,并且提供了有关对象支持的所有操作的描述。接口仓库最常见的功能是为接口浏览器提供信息,帮助应用开发者找出潜在的可重用的软件部件。ORB可以利用接口仓库检查运行时的操作参数类型,但接口仓库的基本功能是提供类型信息,为动态调用接口发送请求提供信息支持。对象引用•对象引用:IOR,InteroperableObjectReference•是分布环境中对一个CORBA对象的访问标识•一个CORBA对象可以有多个IOR,IOR相当于一个指针,而实际指向的只有一个CORBA对象。•IOR中包含了对象的网络地址信息(IP和Port)、相应的对象适配器(OA)信息以及唯一标识(ObjectID)。但定位机制与具体的平台有关,所以IOR中的部分信息只有相应的平台才能完全解读。•对象引用对于编程人员来说可以完全透明。4.2.5OA•对象适配器是对象实现访问、ORB提供服务的主要方法。这些服务包括对象引用的生成和解释,方法的调用,交互的安全,对象和实现的激活和释放。•基本功能•产生和解释对象引用(IOR)•对象实现的注册和请求的鉴权•对象或对象所在实现的激活与去激活•通过Skeleton进行相应的方法调用(上行)•BOA和POA•BOA(V2.1)只具有上述的基本功能,POA(V2.2)是一种改进,具有更好的分布性和可移植性。POA的扩展特性几个需要了解的概念•ORB,•OA,BOA•POA•GIOP,IIOP,•IOR•动态调用接(DII),接口公用库ORB•ORB(ObjectRequestBroker)对象请求代理:它作为一个“软件总线”来连接网络上的不同对象,提供对象的定位和方法调用,它是CORBA实现的关键。在后面会详细讨论ORB。OA,BOA•OA(ObjectAdapter)对象适配器:用于构造对象实现与ORB之间的接口。它给框架发送方法,调用并且支持服务器对象的生命周期(如:对象的创建和删除)。BOA(BasicObjectAdapter)基本对象适配器:负责激活对象,即当客户请求对象的服务时,激活对象实现的能力。POA•POA(PortableObjectAdapter)可移植对象适配器:是BOA的替代方式,提供大量可扩展的接口,来处理一些对于BOA来说不合理的要求。特性:(1)支持透明激活对象。(2)允许单个服务者支持很多对象标识。(3)允许一个服务者上有多个POA,每个都有自己的一套管理策略。(4)将对不存在服务者的请求委托给默认服务者,或者向服务者的管理器请求一个合适的服务者。GIOP,IIOP,IOR•GIOP(GeneralInter-ORBProtocol)通用ORB之间的协议:定义了一个不同ORB之间的接口。IIOP(InternetInter-ORBProtocol)因特网ORB之间的协议:IIOP把GIOP消息数据映射为TCP/IP连接行为和输入/输出流读/写。注意:IIOP不是完全从GIOP分离出来的协议,它更像是GIOP的一个实例。IOR(InteroperableObjectReference)可操作对象引用:它包括所有客户与服务器联系所需的各种信息(包括CORBA服务器对象进程的IP地址和TCP端口等),ORB将通过它产生在网络上唯一标识那个将被分布对象的消息。CORBA的体系结构•CORBA对象的客户有一个对该对象的“对象引用”,客户使用“对象引用”来请求“对象方法”。如果服务端不在本地(不在同一机器的同一应用系统中或不在同一机器中),则“对象引用”指向stub功能(在Java中,stub和skeleton都是类来实现),stub利用ORB机制将请求带到服务端的对象。stub通过ORB来确定运行对象的服务端的机器,并请求该机器的ORB连接到对象的服务端去。stub同ORB建立连接后,向该机的skeleton发送“对象引用”及相关参数,再由skeleton功能连接到目标对象的“对象实现”上。skeleton将请求和参数转换成规定格式然后调用该对象。最后,“对象实现”的结果沿着来的路径传送回客户请求端。•在这个操作过程中,客户并不知道CORBA对象的位置、它的实现细节,也不必知道所使用的ORB是什么。在ORB之间通过建立在TCP/IP标准之上的IIOP-InternetInterORBProtocol进行通信联系,相互传送信息。客户只是使用CORBA对象的接口来调用对象的方法,CORBA对象的接口则使用IDL语言来定义。对象的接口定义了对象的类型,对象的方法和引用参数以及对象方法可能返回的异常结果。IDL编译器将把CORBA对象的定义转换成特定的编程语言。IDL还对每个对象生成相应的stub文件(类)和skeleton文件(类),通过它