




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章分布式对象计算2.1三种典型的分布式对象技术2.2CORBA简介2.3CORBA的基本结构2.4ORB间互操作性2.5CORBA服务和CORBA公共设施2.6CORBA编程2.7CORBA发展趋势2.8CORBA3的新特性2.1三种典型的分布式对象技术目前主要的分布式对象计算互操作标准有OMG组织的CORBA标准、Microsoft公司的COM/DCOM标准和Sun公司的JavaEJB。
CORBA是三者中出现最早的标准。1991年OMG颁布了COBRA1.0标准;从最初的COM发展成现在的DCOM及COM+,Microsoft形成了一套分布式对象的计算平台;而Sun公司的Java平台,在其最早推出时,只提供了远程的方法调用,在当时并不能被称为分布式对象计算,只是属于网络计算里的一种。接着推出的JavaBean,也还不足以和上述两大流派抗衡。其目前的版本J2EE中推出了EJB,其中除了语言外还有组件的标准以及组件之间协同工作通讯的框架。于是,也就形成了目前的三大流派。
COBRA标准主要分为3个层次:对象请求代理、公共对象服务和公共设施。最底层是对象请求代理(ORB,ObjectRequestBroker),规定了分布式对象的定义(接口)和语言映射,实现对象间的通讯和互操作,是分布式对象系统中的"软总线";在ORB之上定义了很多公共服务,可以提供诸如并发服务、名字服务、事务(交易)服务、安全服务等各种各样的服务;最上层的公共设施则定义了组件框架,提供可直接为业务对象使用的服务,规定业务对象有效协作所需的协定规则。总之,CORBA的特点是大而全,互操作性和开放性非常好。目前CORBA的最新版本是3.0,增加了有关Internet集成和传输质量控制等内容。CORBA的缺点是庞大而复杂,并且技术和标准的更新相对较慢,COBRA规范从1.0升级到2.0所花的时间非常短,而再往上的版本的发布就十分缓慢了。相比之下,Java标准的制定就快得多,Java是Sun公司自己定的,演变得很快。Java的优势是纯语言的,跨平台性非常好。Java分布式对象技术通常指远程方法调用(RMI,RemoteMethodInvoke)和企业级JavaBean(EJB,EnterpriseJavaBeans)。RMI提供了一个Java对象远程调用另一Java对象的方法,与传统RPC类似,只能支持初级的分布式对象互操作。Sun公司基于RMI,提出了EJB。基于Java服务器端组件模型,EJB框架提供了像远程访问、安全、交易、持久和生命期管理等多种支持分布式对象计算的服务。目前,Java技术和CORBA技术有融合的趋势。
COM技术是Microsoft独家做的,是在Windows3.1中最初为支持复合文档而使用的OLE技术上发展而来的,经历了OLE2/COM、ActiveX、DCOM和COM+等几个阶段,目前COM+把消息通讯模块MMQS(MicrosoftMessageQueueServer)和解决关键业务的交易模块MTS(MicrosoftTransactionServervice)都加进去了,是分布式对象计算的一个比较完整的平台。Microsoft的COM平台效率比较高,同时它有一系列相应的开发工具支持,应用开发相对简单。但它有一个致命的弱点就是COM的跨平台性较差,如何实现与第三方厂商的互操作性始终是它的一大问题。从分布式对象技术发展的角度来看,普遍认为COM竞争不过COBRA。在这种情况下,2002年Microsoft推出了.NET,很好地解决了跨平台性和语言互操作性问题。下面从对象模型、对象总线、对象服务及其他方面比较COM/DCOM和CORBA在实现上的异同。
1.对象模型
CORBA基于经典对象模型,支持多继承、封装和多态;而COM/DCOM基于对象,只支持封装机制,并不支持IDL描述的多继承。COM组件可以支持多个接口,并可以通过封装内部组件的接口和将它们展示给客户来实现复用,即COM通过包含、代理和聚合而不是继承实现对象复用。
CORBA通过事件服务支持发送接口;COM则通过可链接对象支持发送接口。
CORBA和COM的对象实例都具有全局惟一ID。CORBA的运行对象具有惟一的引用,而COM则没有对象引用的概念,所有客户程序不能在运行时重新链接相同的对象,若要重新链接相同的对象,则需要通过Moniker机制来实现。
CORBA的组件可以是黑盒也可以是白盒,白盒可以通过继承补充;而COM的组件只能是黑盒的。2.对象总线
CORBA和COM对象总线都支持本地和远程的静态方法调用。CORBA总线支持本地和远程的动态调用;COM通过IDispatch支持本地的动态调用,DCOM支持远程的动态调用。
CORBA和COM都将对象的接口和实现分离,并要求所有接口由接口定义语言描述。它们的接口都是客户与服务器之间的协定,都支持跨地址空间的函数调用。COM的IDL是DCEIDL的扩展,而CORBA的IDL则完全基于OMGIDL。
CORBAIDL是语言中立的,提供客户和服务器的语言映射,已有C++、Java等多种语言映射;在语法上,CORBAIDL类似于C++的声明,但它不是C++的;且CORBAIDL没有指针类型。COMIDL不是语言中立的,COM只是进程间通信的二进制互操作标准,不提供语言映射;COMIDL支持包括指针和基于指针数据的结构在内的所有C的数据类型;COMIDL没有定义能够被所有目标语言访问的一组通用的数据类型。
CORBA的对象总线使用接口库来管理和维护IDL元数据信息,可以在本地或远程访问。COM的接口库是类型库,只能在本地访问。COM的实现库是Windows的注册库。
CORBA和COM对象总线都支持组件的封装。3.对象服务
CORBA规范了名字、事件、生命期、持久对象、事务、并发控制、关系、外表化、查询、许可、属性、时间、安全等多个对象服务,多数已经实现。COM目前已经支持名字、事件、持久、生命期、流、许可和特性等服务。此外,COM还支持CORBA所没有的垃圾回收服务。4.其他
CORBA在技术的完整性和先进性上要优于COM/DCOM。对于含有大量定制式应用系统的分布式计算环境,选用CORBA技术和标准支持应用系统较为合理。COM/DCOM的发展历程是先有主导产品后成为标准。Microsoft以其庞大的用户群和应用开发商来左右组件标准,其标准具有实用性强等特点,产品具有较好的一致性,因此在Windows平台上采用COM/DCOM技术实现分布式组件是用户的首选。
COM/DCOM提供了核心的安全和验证机制,但配置客户端的DCOM和让DCOM透过防火墙相当麻烦。而CORBA提供了系统性的安全策略,规范了识别、验证和安全审计等多种安全机制。
CORBA是一个跨平台的开放式标准,配置比DCOM方便。CORBA本身的负载均衡、名字服务和事件服务可以让开发者构建更稳定和扩展性更强的分布式系统。目前经常谈到的分布式对象技术主要就是这三种,COM和EJB的模型、规范、标准和实现可以参考有关书籍。2.2CORBA简介2.2.1CORBA的产生公共对象请求代理体系结构(CORBA,CommonObjectRequestBrokerArchitecture)是由对象管理组织(OMG,ObjectManagementGroup)提出的应用软件体系结构和对象技术规范。对象管理组织(OMG)成立于1989年,作为一个非营利性的组织,一直致力于开发在技术上具有先进性、在商业上具有可行性并且独立于厂商的软件互联规范,推广面向对象模型技术,增强软件的可移植性(Portability)、可重用性(Reusability)和互操作性(Interoperability)。该组织成立之初,成员包括Unisys、Sun、Cannon、Hewlett-Packard、Philips等在业界享有声誉的软硬件厂商,目前该组织拥有800多家成员。
OMG成立后不久就制定了对象管理体系结构(OMA,ObjectManagementArchitecture)参考模型,该模型描述了OMG规范所遵循的概念化的基础结构。OMA由对象请求代理(ORB)、对象服务、公共设施、域接口和应用接口这几个部分组成,其核心部分是对象请求代理(ORB)。对象服务是为使用和实现对象而提供的基本服务集合;公共设施是向终端用户应用程序提供的一组共享服务接口;域接口是为应用领域服务而提供的接口;应用接口是由开发商提供的产品的接口,不属于OMG标准的内容。ORB提供了一种机制,通过这种机制,对象可以透明地发出请求和接收响应。分布的、可以互操作的对象能够利用ORB构造应用。
ORB可看作是在对象之间建立客户/服务关系的一种中间件。基于ORB,客户可以透明地调用服务对象提供的方法,该服务对象可以与客户运行在同一台机器上,也可以运行在其他机器上通过网络与客户进行交互。ORB接收客户发送的请求,并负责在该软件总线上找到实现该请求的服务对象,然后完成参数、方法调用,并返回最终结果。
CORBA的发展历程为(1)1990年11月,OMG发表《对象管理体系指南》,初步阐明了CORBA的思想。(2)1991年10月,OMG推出1.0版,其中定义了接口定义语言(IDL)、对象管理模型以及基于动态请求的API和接口仓库等内容;1991年12月,OMG推出了CORBA1.1版,在澄清了1.0版中存在的二义性的基础上,引入了对象适配器的概念,定义了IDL接口定义语言,开发出对象请求代理(ORB)中间件,在客户机/服务器结构中,ORB通过一定的应用程序接口(API),实现对象之间的交互。(3)1994年12月OMG完成了CORBA2.0,提出了对象请求代理间协议(IIOP,InternetInter-ORBProtocol),用以规范不同厂家的ORB之间的真正互通,同时增加了互操作性和对C++及SmallTalk的匹配,OMG期望通过上述规范建立一种“连接世界的体系结构”。(4)1996年8月,OMG基于以前的升级版本,完成了2.0版的开发,该版本中重要的内容是IIOP的引入,用以实现不同厂商的ORB真正意义上的互通。(5)1998年9月,OMG发布了CORBA2.3版,增加了支持CORBA对象的异步实时传输、服务质量规范等内容。目前,宣布支持CORBA2.3版规范的中间件厂商包括Inprise(Borland)、Iona、BEASystem等著名的CORBA产品生产商。(6)2001年9月,OMG发布了CORBA2.5版,在这个版本中,加入了一些新的内容,包括CORBA容错(FaultTolerantCORBA),实时CORBA(Real-TimeCORBA),并修改了部分CORBAMessaging和PortableInterceptors的内容。(7)2001年12月,OMG发布CORBA2.6版,在2.5版的基础上新增了一章“SecureInteroperability”,并对部分内容作了修改。(8)最新版本是2002年9月发布的CORBA3.0版。2.2.2什么是CORBA
随着互联网技术的日益成熟,公众及商业企业正享受着高速、低价网络信息传输所带来的高品质数字生活。但是,由于网络规模的不断扩大以及计算机软硬件技术水平的飞速提高,给传统的应用软件系统的实现方式带来了巨大挑战。CORBA已经被证实是近年来网络技术发展中最重要的革新之一,它致力于解决当前信息系统存在的两大难题:①难于快速集成现有软硬件系统和新的应用;②开发客户/服务器程序困难。首先,在企业级应用中,硬件系统集成商基于性能、价格、服务等方面的考虑,通常在同一系统中集成来自不同厂商的硬件设备、操作系统、数据库平台和网络协议等,由此带来的异构性给应用软件的互操作性、兼容性以及平滑升级能力带来了严重问题。另外,随着基于网络的业务不断增多,传统的Client/Server模式的分布式应用方式越来越显示出在运行效率、系统网络安全性和系统升级能力等方面的局限性。为了解决DCE中不同硬件设备和软件系统的互联,增强网络间软件的互操作性,解决传统分布式计算模式中的不足等问题,对象管理组织提出了公共对象请求代理体系结构,以增强软件系统间的互操作能力,使构造灵活的分布式应用系统成为可能。正是基于面向对象技术的发展和成熟、客户/服务器软件系统模式的普遍应用以及集成已有系统等方面的需求,推动了CORBA技术的成熟与发展。作为面向对象系统的对象通信的核心,CORBA为当今网络计算环境带来了真正意义上的互联。
CORBA是一个分布式对象技术的规范,它是针对多种对象系统在分布式计算环境中如何以对象方式集成而提出的,它为对象管理定义了一个对象模型——OMG参考模型(OMGReferenceModel)及其框架结构。该模型由ORB、对象服务、公共设施、领域接口及应用对象等5个主要部分组成。该模型及其框架结构将面向对象技术与客户/服务器计算模式结合起来,有效地解决了对象封装和分布式计算环境中资源共享、代码可重用、可移植以及应用间的互操作性等问题。从最顶层来看,CORBA规范指的是对象管理结构(OMA,ObjectManagementArchitecture),该结构如图2.1所示的5部分组成。图2.1OMA参考模型(1)对象请求代理(ORB)。ORB是CORBA的核心,它路由OMA结构中其他部件之间的请求,起到对象通信“软总线”的作用。ORB是构建分布式对象应用、在异构或同构环境下实现应用间互操作的基础。(2)CORBA对象服务。CORBA对象服务(ObjectServices)是为使用和实现对象而提供的基本服务集合。在构建任何分布式应用时经常会使用到这些服务,而且这些服务独立于应用领域。例如生命周期服务定义了对象的创建、删除、拷贝和移动的方法,但它不规定如何在应用中实现这些对象。
CORBA对象服务由OMGCOSS规范规定。COSS规范由一组接口(Interface)和服务行为描述构成,其接口一般使用OMG接口定义语言(IDL,InterfaceDefinitionLanguage)描述。目前COSS规范包括如下内容:命名服务(NamingService)、事件服务(EventService)、生命周期服务(LifeCycleService)、持久对象服务(PersistentObjectService)、并发控制服务(ConcurrencyControlService)、外部化服务(ExternalizationService)、关系服务(RelationshipService)、查询服务(QueryService)、许可服务(LicensingService)、属性服务(PropertyService)、安全服务(SecurityService)和时间服务(TimeService)等。(3)CORBA公共设施。CORBA公共设施(CommonFacilities)提供了一组更高层的函数,这些函数包括用户界面、信息管理等方面的通信设施,为终端用户提供一组共享服务接口,例如综合文档、系统管理和电子邮件服务等。这些服务不像对象服务那么基本。(4)CORBA领域接口。CORBA领域接口(DomainInterface)与特定的应用领域有关,例如制造业、金融业、通信行业等,它为应用领域提供接口。目前,OMG为产品数据管理(PDM,ProductDataManagement)应用制定了规范。在该规范中定义了8个使能器,描述了12个功能模块及其接口,明确了PDM系统与其他应用系统之间交互的方式。(5)应用接口。应用接口(ApplicationInterface)是由销售商提供的、可控制其接口的产品,相当于传统的应用表示。OMG组织不对它们作标准化工作。应用接口位于参考模型的最高层。2.2.3CORBA对象模型对象系统是一系列对象的集合,它通过精心定义的封装接口将服务的请求者(客户)和服务的提供者相分离,尤其是让客户与诸如数据的表示和可执行代码等服务的具体实现相分离。对象模型首先描述对客户有意义的概念,包括对象的产生、标识、请求和操作、类型以及特征标记(Signatures)等。其次,对象模型还要描述与对象实现有关的概念,包括方法、执行引擎和激活等。对象系统在一些概念上,做了很明确详细的规定,但对对象的实现只是建议性的,其目的在于最大程度上使用不同的对象技术、方法来实现对象。对象的语义包括对象、请求、对象的创建和删除、类型、接口及属性等。
CORBA定义了一个软总线框架,制定了有标准接口的对象服务,利用CORBA我们可以集成和组合大型、复杂的分布式应用系统。CORBA对象参考模型描述了应用系统中遵循的概念化的基础结构。1.CORBA的对象参考模型
CORBA的对象参考模型的基础结构如图2.2所示。图中对象实现是指对象功能的具体实现,它将数据和施加在数据上的操作(或称为方法)捆绑在一起,封装在对象中,客户所能看到的只是对象的接口,因此对象实现的改变不会对客户程序产生任何影响。客户调用对象中的操作(或方法),首先要找到对象,即要找到该对象的对象引用(ObjectReference),通过组件访问方法引用对象实现。图2.2CORBA对象参考模型
CORBA采用接口定义语言(IDL)进行对象建模、IIOP进行客户和服务器之间通信。
IIOP即因特网ORB互通协议,它是一个和其他网络协议一起运行在TCP/IP之上的标准网络协议,使不同供应商提供的不同产品之间实现交互操作。2.CORBA的对象引用一个应用组件通过两种机制访问另一组件中的对象:一种是通过值来传递对象,另一种是通过对象引用来传递对象。通过值传递对象机制的实现过程如图2.3(a)所示。(1)被调用的进程q将对象x本身从远端通过网络以0/1序列码的形式传递到主进程p中,建立对象x的副本;(2)对象x的副本执行所调用的操作。对象引用传递对象方法中对象本身仍留在原处,通过对象引用调用对象中的操作,由对象本身执行,实现过程如图2.3(b)所示。图2.3对象传递方法(a)通过值传递;(b)通过对象引用(1)进程q将对象x的对象引用传给主调进程p;(2)进程p根据对象引用来调用对象x中的操作,主调进程p只是通过对象引用看到这个对象,但并不拥有它;(3)调用操作由远端对象x来执行;(4)执行结果从远端送回主调进程p。CORBA通过对象引用机制来实现对象的调用。按照实现的基本过程,CORBA对象服务的实现方式分为两种:对象的命名引用方式和字符串化对象引用方式。2.2.4CORBA的优势与应用1.CORBA的优势
CORBA分布式对象技术标准有许多优势:(1)CORBA在面向对象的标准化和互操作上迈出了坚实的一步。使用CORBA,用户能在不知道软件和硬件平台以及网络位置的情况下透明地获取信息。(2)CORBA自动进行许多网络规划任务,如对象注册、定位、激活,多路径请求,分帧和错误处理机制,并行处理以及执行操作。(3)作为面向对象系统中的通信核心,CORBA为当今的计算环境中带来了真正意义上的互联。(4)CORBA定义了一种面向对象的软件构件构造方法,使不同的应用可以共享此软件构件。(5)每个对象都将其内部操作细节封装起来,同时又向外界提供了精确定义的接口,从而降低了应用系统的复杂性,也降低了软件的开发费用。(6)CORBA的平台无关性实现了对象的跨平台引用,开发人员可以在更大地范围内选择最实用的对象加入到自己的应用系统中。(7)CORBA的语言无关性使开发人员可以在更大范围内相互利用别人的编程技能和成果,是实现软件复用的实用化工具。2.CORBA的应用
CORBA的应用领域广泛,通常应用于以下领域:(1)存取来自现行桌面应用程序的分布信息和资源;(2)使现有业务数据和系统成为可供利用的网络资源;(3)为某一特定业务定制的功能和能力来增强现行桌面工具和应用程序;(4)改变和发展基于网络的系统以反映新的拓扑结构或新资源;(5)目前CORBA主要适合于分布式跨平台的信息管理应用。比较典型的应用是大规模的企业信息管理和事务处理应用,以及行业解决方案(数据库中的中间件技术)和在网管系统中多厂商互连互通解决方案。
CORBA应用的体系结构很多,常用的有三层式架构CORBA或EJB-CORBA互用等形式。1.三层式架构CORBA
一个典型的CORBA中间件系统是一个3层结构。CORBA客户机与CORBA服务器通讯,服务器与某个数据库或传统系统通讯,如图2.4所示。图2.4CORBA客户机-服务器体系结构2.EJB-CORBA互用的体系结构
CORBA与J2EE组件结合的新体系结构如图2.5所示。在这个系统中,J2EE组件被引入到客户机和CORBA服务器之间。客户机从一个CORBA客户机转变成一个RMI客户机,客户机与J2EE组件通讯,随后J2EE组件再与CORBA服务器通讯。J2EE组件等效于新的CORBA客户机。J2EE组件还可以与其他J2EE组件通讯。图2.5J2EE组件与CORBA对象交互操作的体系结构在图2.5所示的体系结构中,J2EE组件与CORBA服务器协同工作,EJB位于客户机和CORBA服务器之间。图2.6显示了EJB-CORBA对象互用的体系结构更详细的视图。客户机使用RMI/IIOP与EJB通讯,而EJB使用IIOP与CORBA服务器通讯。所有的CORBA通讯都封装在一个称为适配器对象的Java辅助器类中。这个适配器对象通常是一个JavaBean,而不是RMI-IIOP转换桥。图2.6EJB-CORBA对象互用的体系结构底部的方框显示的是对象命名服务。CORBA对象在实例化时,把自己绑定到命名服务上。适配器对象首先在命名服务中查找该CORBA服务器对象,获得它的引用。适配器对象获得指向服务器的引用后,就可以调用CORBA服务器对象的业务方法了。为了调用服务器的业务方法,适配器对象可以使用两种调用模型:静态调用接口(SII,StaticInvocationInterface)或动态调用接口(DII,DynamicInvocationInterface)。SII使用由IDL编译器生成的客户机存根来调用方法,因此EJB必须能访问存根。通常,存根与EJB封装在一起来使用。DII无需使用存根,在运行时与服务器对象进行绑定。2.3CORBA的基本结构
CORBA中客户向对象实现发送请求的过程如图2.7所示。
其中客户是指使用某个对象来实现某种操作的实体,对象实现是指具体实现这一对象的代码和数据。ORB提供了如下支持分布式处理的机制:为请求查找具体的对象实现、让对象实现做好接受请求的准备、传送构成请求的数据等。客户所看到的接口完全独立于对象所在的物理位置、实现对象的编程语言以及在对象接口中没有反映出来的其他特性。图2.7通过对象请求代理传送的请求
CORBA的接口结构如图2.8所示。其中条形框表示ORB所提供的接口,箭头表示这个ORB是否被调用或者正在通过接口执行下一个调用。图2.8ORB接口结构图
ORB接口结构图揭示了CORBA工作的基本原理。
ORB是建立对象之间客户/服务器关系的中间件。它使得某个对象可以透明地向其他对象发出请求或接受其他对象的响应。ORB通过接口定义语言(IDL,InterfaceDefinitionLanguage)程序框架或者动态程序框架来定位响应的代码实现、传送参数以及对对象实现的传送控制。接口和适配器都有其特定的程序框架,在执行请求时,对象实现可以通过对象适配器获得ORB提供的服务,这一请求完成后,控制权和输出结果返回客户。客户通过访问对象引用,了解对象的类型以及所需执行的操作,并在此基础上执行请求。客户通过发送请求使用对象所实现的服务,客户方可以有三种具体实现方式:使用静态OMGIDL码根,使用动态调用接口,以及为了调用某些特殊功能,用户可能需要与ORB进行直接交互。客户端可以看到的接口有:静态OMGIDL码根、动态调用接口、ORB接口和接口库。其中静态OMGIDL码根为客户提供静态调用方式,这些经过预编译的IDL码根定义了客户程序如何调用服务器程序的相应服务,从客户角度看,就如同一般的调用,是远程服务器对象的代理;动态调用接口允许用户在运行过程中查找并加以调用;ORB接口是一个包含本地服务的接口,这些服务可以直接为应用程序所使用。接口库是一个运行库,包含由IDL定义接口的机器可读版本,接口库还是ORB的一个动态元数据库,ORB上的组件可以动态访问、存储、修改元数据。对象的实现同样有三种方式:通过OMGIDL产生程序框架(Skeleton)、通过动态程序框架(DynamicSkeleton)接收作为上行调用(up-Call)的请求以及在处理请求或其他任何时候,对象实现均可以调用对象适配器和ORB。服务器方能看到的CORBA系统接口有:服务器程序框架、动态程序框架接口、对象适配器、ORB接口和实现库。其中服务器程序框架为服务器程序的每个服务提供静态接口,同静态OMGIDL码根一样,服务器程序框架也是由IDL编译器产生的;动态程序框架接口允许对象调用的动态处理;对象适配器位于ORB核心通信服务顶端,代替服务对象接受服务请求;ORB接口可以直接为应用程序所使用;实现库存储服务器程序支持的类、实例化对象等。对象的实现可以选择合适的适配器,对象适配器的选择由对象所需要的服务而定。图2.9为显示客户和对象实现如何使用接口和实现信息。用OMGIDL或接口库方式来定义接口,该定义用于产生客户码根和对象实现的程序框架。在安装时把对象实现信息放入实现资源库中,以备请求使用。图2.9接口与实现资源库2.3.1对象请求代理(ORB)1.ORB的作用在传统的基于客户机/服务器模式的应用程序开发过程中,项目开发人员遵循公开的标准或自由设计模块间的协议,这样的协议依赖于网络类型、实现语言、应用方式等。引入ORB后,客户只要遵循服务对象的对外接口标准向服务对象提出业务请求,由ORB在分布式对象间建立客户-服务对象关系。总结起来,ORB的作用包括:(1)接受客户发出的服务请求,完成请求在服务对象端的映射;(2)自动设定路由寻找服务对象;(3)提交客户参数;(4)携带服务对象计算结果返回客户端。由图2.7可以看出,客户向服务对象的实现发出事务请求,其中客户是向对服务对象发出方法请求的实体,服务对象应包括该方法的数据资源以及实现代码。对象请求代理的作用就是定位服务对象,接收客户发出的服务请求并将服务对象的执行结果返回给客户。请求发出后,客户对象采用轮询等方式来获取服务对象计算的结果。2.ORB的结构及类型
ORB提供了对象请求与回答的通信机制,使CORBA应用开发者无需关心具体通信细节,而把注意力集中到实际的应用程序逻辑中去。在ORB结构中,ORB并不需要作为一个单独的组件来实现,而是通过一系列接口和接口定义中说明要实现操作的类型,确定提供的服务和实现客户与服务对象通信的方式。通过IDL接口定义、接口库或适配器的协调,ORB可以向客户机和具备服务功能的对象实现提供服务。作为CORBA体系结构的核心,ORB可以实现如下三种类型的接口:(1)对于所有的ORB实现具有相同的操作;(2)针对特定类型对象的操作;(3)与对象实现类型有关的操作。基于ORB实现的不同类型接口,一个客户端请求可以同时访问多个由不同ORB实现通信管理的对象引用。在实际应用中,只要遵循公共的ORB体系结构,程序设计就可以选择ORB的多种实现方式,其中包括:(1)客户和实现驻留(Client-ImplementationResident)的ORB:采用驻留在客户端和以服务对象实现程序的方式实现ORB。在这种实现方式下,客户端可以通过码根程序,以位置透明的方式向具体的实现对象提出服务请求,实现客户与服务对象的通信。(2)基于服务(Server-Based)的ORB:客户对象和实现对象均可以与一个或多个服务对象进行通信,服务对象的功能是将请求从客户端发送到对象实现。在这种方式中,ORB的作用是完成客户对象与实现对象的通信,为对象之间的交互提供服务。(3)基于系统(System-Based)的ORB:在这种实现方式中,ORB被操作系统认为是系统所提供的一项基本服务。由于操作系统了解调用方与服务对象的位置,因而可以充分地实现ORB功能的优化。(4)基于库(Library-Based)的ORB:如果认为对象实现可以共享,则可以将实现功能放入实现库(ImplementationRepository)中,从而创建基于库的ORB。3.ORB中的主要方法客户端和服务对象端均可以自由选择使用ORB对象中定义的方法来实现操作。下面举例说明ORB对象中的重要方法。1)ORBORB_init(inoutarg_listargv,inORBidorb_identifier)作用:ORB初始化。2)Stringobject_to_string(inObjectobj)
作用:将对象的引用转换成客户可以用字符串方式存储的对象信息。3)Objectstring_to_object(inStringstr)
作用:方法object_to_string(inObjectobj)的逆过程。将以字符串方式存储的对象转换成对对象类型的引用。4)Objectresolve_initial_references(inObjectIDidentifier)
作用:获取初始对象引用。5)Policyget_policy(inPolicyTypepolicy_type)
作用:返回指定类型的服务策略对象。作为公共对象请求代理体系结构中的核心内容,ORB提供了相当丰富的方法。读者可以查阅相关资料详细了解ORB中的其他方法。4.服务请求的实现方式关于对象请求的实现方式,CORBA规范中定义客户程序可以用动态调用接口(DII,DynamicInvocationInterface)方式或通过OMGIDL文件经编译后在客户端生成的码根方式提出服务请求。这两种实现方式的区别在于通过OMGIDL码根文件方式实现的调用请求中,客户能够访问的服务对象方法取决于服务对象所支持的接口;而动态调用接口调用方式则与服务对象的接口无关。尽管实现调用请求的方式有所区别,但客户发出的请求服务调用的语义是相同的,服务对象不去分析服务请求提出的方式。
ORB通过IDL码根方式或动态调用接口(DII)方式定位服务对象的实现代码、传递服务对象应用参数以及完成对请求传送方式的控制。服务对象的实现通过对象适配器提供对客户请求的服务。从对服务请求调用方式的分析可以看出:服务对象接口的定义在整个CORBA系统服务功能的实现中起着相当重要的作用。那么如何实现服务对象的功能接口呢?CORBA规范中定义了两种接口实现方式:第一种形式是利用OMGIDL接口定义语言对接口进行描述。IDL语言有详细的语法规则。经过对所实现功能的系统分析,利用IDL,依据服务对象可能实现的服务以及服务中需要的参数,对接口进行定义。另外一种方式是将接口放入接口仓库(InterfaceRepository)中,在运行期间对接口库中的接口进行访问。2.3.2OMGIDL
从本质上讲,OMGIDL接口定义语言不是作为程序设计语言体现在CORBA体系结构中的,而是用来描述产生对象调用请求的客户对象和服务对象之间的接口语言。OMGIDL文件描述数据类型和方法框架,而服务对象则为一个指定的对象实现提供上述数据和方法。
OMGIDL文件描述了服务器提供的服务功能,客户机可以根据该接口文件描述的方法向服务器提出业务请求。在大多数CORBA产品中都提供IDL到相关编程语言的编译器。程序设计人员只需将定义的接口文件输入编译器,设定编译选项后,就可以得到与程序设计语言相关的接口框架文件和辅助文件。IDL文件的应用过程如图2.10所示。图2.10IDL文件应用过程在语法规则方面,类似于C++或Java中关于接口或对象的定义,OMGIDL增加了一些构造方法支持IDL特有的方法调用机制。OMGIDL只是一种说明性的语言,支持C++语法中的常量、类型和方法的声明。采用OMGIDL这样的说明性语言,其目的在于克服特定编程语言在软件系统集成及互操作方面的限制,这正是CORBA的诱人之处,同时也体现了采用CORBA构造分布式应用程序在网络时代的强大生命力。OMGIDL已经为C、C++、Java等主要高级程序设计语言制定了IDL到高级编程语言的映射标准。项目开发人员可以根据需要选择自己最熟悉的编程语言来独立开发基于CORBA的应用,而对软件系统的互操作能力不产生影响。1.OMGIDL的语法规则OMGIDL文件举例。moduleCompute{
typedefdoubleradius;
typedeflongtimes;interfacePI{doublegetResult(inradiusaRadius,intimestime);}}上述接口定义文件主要用于客户端向服务对象提出请求:计算π值。因此,模块Compute中定义了直径(aRadius)、迭代次数(times)以及接口PI,接口PI中定义了一个方法getResult(),以圆的aRadius和times作为该方法的输入参数。2.OMGIDL词法规则
OMGIDL采用ASCII字符集构成接口定义的所有标识符。标识符由字母、数字和下划线的任意组合构成,但第一个字符必须是ASCII字母。IDL认为大写字母和小写字母具有相同的含义,例如anExample和AnExample是相同的。与C++和Java类似,采用以“/*”开始,以“*/”结束来注释一段代码;或以“//”开始,注释从“//”开始直至行尾的所有内容。另外,IDL保留了47个关键字,程序设计人员不能将关键字用作变量或方法名。需要注意的是关键字的大小写,例如:
typedefdoublecontext;//错误:定义的变量context是关键字
typedefdoubleCONTEXT;//错误:CONTEXT与关键字context冲突
3.数据类型(1)基本数据类型:OMGIDL基本数据类型包括short、long和相应的无符号(unsigned)类型,表示的字长分别为16和32位。(2)浮点数类型:OMGIDL浮点数类型包括float、double和longdouble类型。其中float表示单精度浮点数,double表示双精度浮点数,longdouble表示扩展的双精度浮点数。(3)字符和超大字符类型:OMGIDL定义字符类型char为面向字节的集中编码的单字节字符;定义类型wchar为从任意字符集中编码的超大字符。(4)逻辑类型:用boolean关键字定义的一个变量,取值只有true和false。(5)八进制类型:用octet关键字定义,在网络传输过程中不进行高低位转换的位元序列。(6)any数据类型:引入该类型用于表示OMGIDL中任意数据类型。4.常量
OMGIDL用const关键字声明一个常量,用于模块(Module)或接口(Interface)中定义保持不变的量,如:
constdoublePI=3.1415926;
在IDL中,可以定义long、unsignedlong、unsignedshort、char、boolean、float、double、string类型的常量。5.构造数据类型类似于C和C++的语法规则,OMGIDL中构造数据类型包括结构、联合、枚举等形式。如下例:(1)结构类型:
typedeflongGoodsNumber;
struct
{
GoodsNumbernumber;stringname;floatprice;}(2)联合类型:unionstockInswitch(short){case1:stocker:long;case2:goodsName1:string;case3:goodsName2:string;}(3)枚举类型:enumGoodsStatus{GOODS_SALED,GOODS_INSTOCK};6.数组类型
OMGIDL的数组类型提供了多维定长、统一数据格式的数据存储方式——数组。每一维的长度必须在定义时给定,所有数据单元必须存储相同类型的元素。如下例定义一个长度为20×100的整数数组:
typedeflongaDimension[20][100];7.模板(template)类型
OMGIDL提供两种类型的模板:(1)序列(sequence)类型:用该方法定义长度可变的任意数值类型的存储序列,通常在定义时可以指定长度,也可以不指定,如:
typedefsequence<long,80>aSequence;//长度定义为80
typedefsequence<long>anotherSequence;//长度不定
(2)字符串(string)序列:同样对于字符串序列类型,也有两种定义方式:
typedefstring<80>aName;//长度定义为80
typedefstringanotherName;//长度不定8.接口(interface)
接口作为服务对象功能的详细描述,封装了服务对象提供服务方法的全部信息,客户对象利用该接口获取服务对象的属性、访问服务对象中的方法。接口用关键字interface声明,其中包含的属性和方法对所有提出服务请求的客户对象是公开的,如下例:interfaceJobManager{readonlyattributestringFirstName;attributestringstatus;}9.接口的继承与C++和Java中类的继承类似,OMGIDL中关于接口的继承分为两种类型:(1)单继承:一个接口继承另一个接口的属性及方法特征;(2)多继承:一个接口继承两个或两个以上接口的属性及方法特征。用继承关系编写接口定义时,如果在接口定义之前该接口的父接口没有定义,则需要在定义接口之前先声明父接口,即所谓的前置声明(ForwardDeclaration)。下面举例说明接口继承。在已经定义了人力资源管理接口JobManager后,由于实际需要,还要根据该接口定义资源服务接口,而该接口应继承管理接口的特征。因此,以管理接口为父对象定义新的接口JobServer:interfaceJobServer:JobManager
{voidMailToManager(inlongManagerId,outstringstatus);
}
JobServer:JobManager表明接口JobServer继承JobManager的对象特征。10.异常处理(Exception)
与C++和Java的语法规则类似,CORBAIDL同样提供了异常处理机制,称为引发异常(RaisinganException)。CORBA本身定义了一部分由调用请求或ORB传递引发的异常,称为系统异常(SystemException)。因此,在OMGIDL中定义的异常通常称为“自定义异常”。
OMGIDL中用Exception关键字定义用户异常,在定义的方法后面加上raise关键字来声明,如果符合异常的触发条件,则引发定义类型的异常。如下例所示:enumErrorStatus{Fatal,Important,Slight,NoMeaning};ExceptionReasonOfMail{ErrorStatusstatus;}interfaceJobManager{stringQueryJobStatus(inlongNumber,outstringproperty)raises(ReasonOfMail);}11.定义方法传递的上下文在前面曾提到过上下文,上下文在接口定义的方法中是如何传递的呢?上下文对象中包括一个称为特征名-特征值的名值对,在方法中使用context关键字定义。ORB在每次客户机发出调用请求时,在对象实现中匹配特征值。如下例所示:
stringQueryJobStatus(inlongNumber,outstringproperty)
raise(ReasonOfMail)context(“who”);
按照以上定义,执行QueryJobStatus方法时,ORB在服务对象实现端的上下文序列中匹配特征名为“who”的特征值。2.3.3OMGIDL到编程语言的映射
CORBA规范中定义了OMGIDL语言到具体编程语言的映射,目前的映射包括了C、C++、SmallTalk、Ada95和Java等,适用多种编程的应用软件实体,体现了语言的异构性。语言映射包括对该编程语言所用到的数据类型的定义,以及一些通过ORB能够进行对象访问的函数接口,包括客户方码根接口的结构(针对非面向对象语言)、动态调用接口的结构、服务端程序框架对象适配器以及直接的ORB接口结构。语言映射同时也定义了对象调用和客户的控制线程之间的交互和实现。不同的面向对象或非面向对象编程语言可以采用各自喜欢的不同方式访问CORBA对象,面向对象语言可能将CORBA对象看作编程语言对象,即使是非面向对象的编程语言,也可以将对象引用、方法名字的精确ORB表示隐蔽起来。对所有的ORB实现,从OMGIDL到一种特定编程语言的映射方法应该是相同的。2.3.4ORB接口(ORBInterface)ORB接口是ORB核心给出的界面。ORB接口同时为客户方和对象实现方所用,提供了一些只能由ORB内核提供的服务ORB接口函数,包括对象引用操作、ORB初始化、对象适配器初始化和获取初始对象引用等。
ORB接口不依赖对象接口或对象适配器执行ORB系统功能。ORB接口提供一组标准的API来实现一部分客户端和服务器端公共需要的功能,ORB接口中的这些操作对于所有ORB和所有对象实现都是相同的,并能为所有对象的客户和实现执行。
ORB接口、动态调用接口和动态程序框架的相同点在于,他们都是一组标准的API,因此尽管ORB可能由不同的厂商来实现,但对这部分API的使用却是不变的。此外,这些API的使用方式与普通CORBA调用方式一样,使程序员认为服务器端存在相应的对象在提供实现,实际上这些对象都是在ORB内部实现的。2.3.5客户方码根(ClientStub)
客户方码根为客户提供静态调用方式。这些经过预编译的IDL码根定义了客户程序如何调用服务器程序的相应服务。客户方的码根负责把用户的请求进行编码发送到对象实现端,并对接收到的处理结果进行解码,把结果或异常信息返回给用户,从客户角度看,就如同是一个本地调用,是远程服务器对象的代理。
对于非面向对象语言的映射,每一个IDL接口类型都将有一个编程接口支持对生成的码根的调用。通常,码根使用一种简单的方式,以便访问OMGIDL定义的对象操作,这种方式使得编程人员只要熟悉OMG接口定义语言和所映射的编程语言即可。该码根利用那些对ORB核心专用的、优化的接口调用ORB的其他部分。如果不只一个ORB,则针对不同的ORB就有不同的码根。在这种情况下,ORB与语言映射必须协调一致以便将正确的码根和特定的对象引用相关联。码根实际上是一段程序代码,为接口的每一种操作(方法)提供一种虚实现,具有以下特点:(1)码根是自动生成的,不需程序员的参与。ORB根据IDL的接口定义生成响应的客户端码根和服务器端静态框架。(2)码根是静态的,一经生成便不再改变,除非修改响应的IDL并重新生成。(3)码根是与ORB的具体实现相关的。不同的ORB厂商会有不同的ORB实现,即使相同的IDL接口定义也可能生成不同的码根。2.3.6服务端程序框架(ServerSkeletons)
服务方的程序框架是在对象实现方与客户方码根相对应的实现机制上,服务方的程序框架对用户请求进行解码,定位所要求的对象的方法,执行该方法并把执行结果或异常信息编码后发送回客户。这种调用适用于在客户执行前服务已知的情况,通常称为“静态调用方式”(SII,StaticInvacationInterface),它支持同步请求调用。静态IDL框架是由IDL编译器产生的ORB中调用对象实现的界面。通过它,可以用ORB调用对象实现中的方法,对象实现根据该界面给出具体的实现例程。IDL框架的存在并不意味着有相应的客户IDL的存在。ORB也可以不使用IDL框架而使用对象适配器来进行对象实现方法的调用,特殊的语言映射可以依靠对象适配器来实现,因为它上面有到对象实现的界面。2.3.7动态调用接口(DII,DynamicInvacationInterface)
动态调用接口是用来在运行时发现被调用的方法、新对象以及它们的接口和它们的定义。动态调用接口允许在客户端,通过指定目标对象的引用、操作、属性及被传送的参数来动态创建和调用对服务对象的请求,并发送到对象实现方。在这种调用方式下,用户往往预先不知道服务对象的接口信息,首先通过查询或者其他手段获得服务对象的接口描述信息,然后自行调用ORB的方法来构造用户请求,并发送到对象实现方。一个请求包括对象的引用、操作和参数列表。其中参数列表的定义如下:
typedefunsignedlongFlags;
structNamedValue
{Identifiername;Anyarguments;Longlen;Flagsarg_modes;}其中name表示传递的参数名;arguments表示传递的参数;len表示参数长度;arg_modes代表参数模式标识。动态调用请求操作有很多方法,下面就有关动态请求的相应方法进行简单介绍:(1)voidcreate_request(inContextctx;inIdentifieroperation;inNVListarg_list;inoutNamedValueresult;outRequestrequest;inFlagsreq_flags;)作用:创建动态请求;方法参数:该方法中包含的参数依次为操作中使用的context对象、对象的操作类型、操作中使用的参数、方法结果、返回的调用请求和请求中使用的标志。(2)voidget_response()raises(WrongTransaction)
作用:返回请求执行的结果。调用该方法后将一直等待直到所请求的方法完成。(3)voidget_next_response(RequestSeq*&)raises(WrongTransaction)
作用:返回完成的下一个请求;方法参数:对象请求序列标识。2.3.8动态程序框架接口(DSI,DynamicSkeletonInterface)
在对象实现方也有一种与动态调用接口相类似的动态分发用户请求的机制,称为动态框架接口,动态调用接口与动态程序框架接口支持了动态调用方式。
DSI的基本思想是让ORB/OA对所有的对象调用请求都通过向上调用例程(动态实现例程DIR)来调用实际对象中的操作。由于在任何语言映射中所有的DIR有相同的标记(Signature),所以单个DIR可以通过使用不同的接口用来作为多个对象的实现。所有操作参数、被调用对象的标识和被请求的操作都被传给DIR,这些信息被编码到请求参数中。DIR能使用被调用的对象、对象适配器和接口库来了解特定对象和调用的更多信息,它能存取和操作各个参数,并能像其他对象实现一样使用对象适配器,对象适配器通过将服务端请求传递给与对象实现有关的DIR,从而将调用分发给基于DSI的对象实现。对象实现为了使用DSI,必须实现一个或多个具有DynamicImplementation接口的对象,并向OA注册由该对象处理某种IDL接口的调用请求。DynamicImplementation接口的invoke操作即DIR。对象实现所实现的DynamicImplementation接口对用户来说是透明的,即客户只知道对象实现程序实现了某个目标对象的接口,但不知道对象实现是通过该目标对象接口的静态程序框架还是DynamicImplementation的方式实现的。动态程序框架接口中ServerRequest对象是DynamicImplementation接口invoke操作的关键,类似于DLLD中的Request对象,它完整地记录了一个客户调用请求的全部内容。2.3.9对象适配器(ObjectAdapter)
对象适配器是为服务对象端管理对象引用和实现而引入的。对象适配器介于ORB内核和对象实现之间,负责服务对象的注册、对象引用的创建和解释、服务进程的激活和结束以及客户请求的分发。在CORBA规范中要求系统实现时对象适配器完成如下功能:(1)生成并解释对象的引用,把客户端的对象引用映射到服务对象的功能中;(2)激活或撤消对象的实现;(3)注册服务功能的实现;(4)确保对象引用的安全性;(5)完成对服务对象方法的调用。基本对象适配器(BOA,BasicObjectAdapter)是CORBA中定义的在分布式应用程序设计中常用的对象适配器。其工作方式是ORB将服务请求的参数及操作控制权传递给BOA,由BOA将执行结果返回给ORB。BOA用服务对象框架(Skeleton)将ORB和对象实现中的方法联系在一起,服务对象框架中相应的方法将对BOA方法的请求调用映射为服务对象中的方法。按照此规范,CORBA的客户端是可移植的,但服务器却不是。为了解决服务器端的移植性问题,CORBA2.2定义了一个新的对象适配器——可移植对象适配器(POA,PortableObjectAdapter)。POA像BOA一样,可以启动每一个方法的服务器程序、每一个对象的分离程序和某个对象类型所有实例的共享程序。POA同样支持静态框架和动态框架接口。
POA还引入了一些新的特性,但必须为对象接口(或实现类型)的每一个实现提供一个实例管理器,实例管理器创建伺服程序(Servant,用来实现和表示CORBA对象的编程语言实体)或特殊实现的运行实例,POA调用实例管理器上的操作,按需创建伺服程序。
POA提供了伺服程序在不同CORBA厂家的ORB实现之间的可移植性。一个服务器应用程序中可能包含多个POA实例,以便支持不同特性的CORBA对象或多种伺服程序的实现类型。但是,所有服务器应用程序至少应有一个名为“根POA”的POA。POA为开发人员提供了一组特性和服务,用来编写可伸缩性强的、高性能的服务器应用程序。在开发人员实现CORBA对象和向CORBA对象传送请求时,它对合理使用资源起着重要作用。2.3.10接口库(IR,InterfaceRepository)CORBA引入接口库的目的在于使服务对象能够提供持久的对象服务。将接口信息存入接口仓库后,如果客户端应用提交动态调用请求(DynamicInvocation),ORB可以根据接口库中的接口信息及分布环境下数据对象的描述,获取请求调用所需的信息。接口库作为CORBA系统的组成部分,管理和提供到OMGIDL映射接口定义的访问。接口库中信息的重要作用是连接各个ORB,当请求将对象从一个ORB传递给另一个ORB时,接收端ORB需要创建一个新对象来代表所传递的对象,这就需要在接收端ORB的接口仓库中匹配接口信息。通过从服务请求端ORB的接口仓库中获得接口标识,就可以在接收端的接口仓库中匹配到该接口。接口库由一组接口库对象组成,代表接口库中的接口信息。接口库提供各种操作来完成接口的寻址、管理等功能。在实现过程中,可以选择对象永久存在还是引用时再创建等方式。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年教师招聘之《小学教师招聘》考前冲刺练习题含完整答案详解(名校卷)
- 2025内蒙古呼伦贝尔职业技术学院招聘30人笔试备考附答案详解
- 教师招聘之《幼儿教师招聘》模拟考试高能含答案详解【达标题】
- 教师招聘之《小学教师招聘》考前冲刺测试卷附有答案详解(必刷)附答案详解
- 演出经纪人之《演出经纪实务》能力检测试卷附答案详解ab卷
- 教师招聘之《小学教师招聘》通关测试卷及参考答案详解【巩固】
- 教师招聘之《小学教师招聘》强化训练题型汇编附参考答案详解(培优a卷)
- 教师招聘之《幼儿教师招聘》考前冲刺练习题及参考答案详解(轻巧夺冠)
- 2025年浙江公务员行测考试真题及答案
- 2025年全国职业院校技能导游专业(导游基础知识)考试题库与答案
- 《无人机基础概论》无人机专业全套教学课件
- 卡西欧 fx-991CN X 科学计算器使用说明书
- 滇桂黔文旅产业融合水平测度与比较
- 安全总监培训课件
- 陕西物业资质管理办法
- 婴儿配方奶粉管理办法
- 甘油二酯油与心脏健康科学指南
- 英语电影配音教学课件
- 办公场所消防培训课件
- 2025-2030年中国铜包铝线行业市场现状供需分析及投资评估规划分析研究报告
- JG/T 333-2011混凝土裂缝修补灌浆材料技术条件
评论
0/150
提交评论