资源描述
第2章 分布式对象计算 第2章 分布式对象计算 2.1 三种典型的分布式对象技术 2.2 CO RBA简介 2.3 CO RBA的基本结构 2.4 O RB间互操作性 2.5 CO RBA服务和CO RBA公共设施 2.6 CO RBA编程 2.7 CO RBA发展趋势 2.8 CO RBA3 的新特性 第2章 分布式对象计算 2.1 三种典型的分布式对象技术 目前主要的分布式对象计算互操作标准有OMG组织的CORBA标准、Microsoft公司的COM/DCOM标准和Sun公司的Java EJB。 第2章 分布式对象计算 CORBA是三者中出现最早的标准。1991年OMG颁布了COBRA 1.0标准;从最初的COM发展成现在的DCOM及COM,Microsoft形成了一套分布式对象的计算平台;而Sun公司的Java平台,在其最早推出时,只提供了远程的方法调用,在当时并不能被称为分布式对象计算,只是属于网络计算里的一种。接着推出的JavaBean,也还不足以和上述两大流派抗衡。其目前的版本J2EE中推出了EJB,其中除了语言外还有组件的标准以及组件之间协同工作通讯的框架。于是,也就形成了目前的三大流派。 第2章 分布式对象计算 COBRA标准主要分为3个层次:对象请求代理、公共对象服务和公共设施。最底层是对象请求代理(ORB,Object Request Broker),规定了分布式对象的定义(接口)和语言映射,实现对象间的通讯和互操作,是分布式对象系统中的软总线;在ORB之上定义了很多公共服务,可以提供诸如并发服务、名字服务、事务(交易)服务、安全服务等各种各样的服务;最上层的公共设施则定义了组件框架,提供可直接为业务对象使用的服务,规定业务对象有效协作所需的协定规则。 第2章 分布式对象计算 总之,CORBA的特点是大而全,互操作性和开放性非常好。目前CORBA的最新版本是3.0,增加了有关Internet集成和传输质量控制等内容。CORBA的缺点是庞大而复杂,并且技术和标准的更新相对较慢,COBRA规范从1.0升级到2.0所花的时间非常短,而再往上的版本的发布就十分缓慢了。 第2章 分布式对象计算 相比之下,Java标准的制定就快得多,Java是Sun公司自己定的,演变得很快。Java的优势是纯语言的,跨平台性非常好。Java分布式对象技术通常指远程方法调用(RMI,Remote Method Invoke)和企业级JavaBean(EJB,Enterprise Java Beans)。RMI提供了一个Java对象远程调用另一Java对象的方法,与传统RPC类似,只能支持初级的分布式对象互操作。Sun公司基于RMI,提出了EJB。基于Java服务器端组件模型,EJB框架提供了像远程访问、安全、交易、持久和生命期管理等多种支持分布式对象计算的服务。目前, Java技术和CORBA技术有融合的趋势。 第2章 分布式对象计算 COM技术是Microsoft独家做的,是在Windows 3.1中最初为支持复合文档而使用的OLE技术上发展而来的,经历了OLE 2/COM、ActiveX、DCOM和COM等几个阶段,目前COM把消息通讯模块MMQS(Microsoft Message Queue Server)和解决关键业务的交易模块MTS(Microsoft Transaction Servervice)都加进去了,是分布式对象计算的一个比较完整的平台。Microsoft的COM平台效率比较高,同时它有一系列相应的开发工具支持,应用开发相对简单。 第2章 分布式对象计算 但它有一个致命的弱点就是COM的跨平台性较差,如何实现与第三方厂商的互操作性始终是它的一大问题。从分布式对象技术发展的角度来看,普遍认为COM竞争不过COBRA。在这种情况下,2002年Microsoft推出了.NET,很好地解决了跨平台性和语言互操作性问题。 下面从对象模型、对象总线、对象服务及其他方面比较COM/DCOM和CORBA在实现上的异同。 第2章 分布式对象计算 1对象模型 CORBA基于经典对象模型,支持多继承、封装和多态;而COM/DCOM基于对象,只支持封装机制,并不支持IDL描述的多继承。COM组件可以支持多个接口,并可以通过封装内部组件的接口和将它们展示给客户来实现复用,即COM通过包含、代理和聚合而不是继承实现对象复用。 CORBA通过事件服务支持发送接口;COM则通过可链接对象支持发送接口。 第2章 分布式对象计算 CORBA和COM的对象实例都具有全局惟一ID。CORBA的运行对象具有惟一的引用,而COM则没有对象引用的概念,所有客户程序不能在运行时重新链接相同的对象,若要重新链接相同的对象,则需要通过Moniker机制来实现。 CORBA的组件可以是黑盒也可以是白盒,白盒可以通过继承补充;而COM的组件只能是黑盒的。 第2章 分布式对象计算 2对象总线 CORBA和COM对象总线都支持本地和远程的静态方法调用。CORBA总线支持本地和远程的动态调用;COM通过IDispatch支持本地的动态调用,DCOM支持远程的动态调用。 CORBA和COM都将对象的接口和实现分离,并要求所有接口由接口定义语言描述。它们的接口都是客户与服务器之间的协定,都支持跨地址空间的函数调用。COM的IDL是DCE IDL的扩展,而CORBA的IDL则完全基于OMG IDL。 第2章 分布式对象计算 CORBA IDL是语言中立的,提供客户和服务器的语言映射,已有C、Java等多种语言映射;在语法上,CORBA IDL类似于C的声明,但它不是C的;且CORBA IDL没有指针类型。COM IDL不是语言中立的,COM只是进程间通信的二进制互操作标准,不提供语言映射;COM IDL支持包括指针和基于指针数据的结构在内的所有C的数据类型;COM IDL没有定义能够被所有目标语言访问的一组通用的数据类型。 第2章 分布式对象计算 CORBA的对象总线使用接口库来管理和维护IDL元数据信息,可以在本地或远程访问。COM的接口库是类型库,只能在本地访问。COM的实现库是Windows的注册库。 CORBA和COM对象总线都支持组件的封装。 第2章 分布式对象计算 3对象服务 CORBA规范了名字、事件、生命期、持久对象、事务、并发控制、关系、外表化、查询、许可、属性、时间、安全等多个对象服务,多数已经实现。COM目前已经支持名字、事件、持久、生命期、流、许可和特性等服务。此外,COM还支持CORBA所没有的垃圾回收服务。 第2章 分布式对象计算 4其他 CORBA在技术的完整性和先进性上要优于COM/DCOM。对于含有大量定制式应用系统的分布式计算环境,选用CORBA技术和标准支持应用系统较为合理。COM/DCOM的发展历程是先有主导产品后成为标准。Microsoft以其庞大的用户群和应用开发商来左右组件标准,其标准具有实用性强等特点,产品具有较好的一致性,因此在Windows平台上采用COM/DCOM技术实现分布式组件是用户的首选。 第2章 分布式对象计算 COM/DCOM提供了核心的安全和验证机制,但配置客户端的DCOM和让DCOM透过防火墙相当麻烦。而CORBA提供了系统性的安全策略,规范了识别、验证和安全审计等多种安全机制。 CORBA是一个跨平台的开放式标准,配置比DCOM方便。CORBA本身的负载均衡、名字服务和事件服务可以让开发者构建更稳定和扩展性更强的分布式系统。 目前经常谈到的分布式对象技术主要就是这三种,COM和EJB的模型、规范、标准和实现可以参考有关 书籍。 第2章 分布式对象计算 2.2 CO RBA简介 2.2.1 CORBA的产生 公共对象请求代理体系结构(CORBA,Common Object Request Broker Architecture)是由对象管理组织(OMG,Object Management Group)提出的应用软件体系结构和对象技术规范。 第2章 分布式对象计算 对象管理组织(OMG)成立于1989年,作为一个非营利性的组织,一直致力于开发在技术上具有先进性、在商业上具有可行性并且独立于厂商的软件互联规范,推广面向对象模型技术,增强软件的可移植性(Portability)、可重用性(Reusability)和互操作性(Interoperability)。该组织成立之初, 成员包括Unisys、Sun、Cannon、Hewlett-Packard、Philips等在业界享有声誉的软硬件厂商,目前该组织拥有800多家成员。 第2章 分布式对象计算 OMG成立后不久就制定了对象管理体系结构(OMA,Object Management Architecture)参考模型,该模型描述了OMG规范所遵循的概念化的基础结构。OMA由对象请求代理(ORB)、对象服务、公共设施、域接口和应用接口这几个部分组成,其核心部分是对象请求代理(ORB)。对象服务是为使用和实现对象而提供的基本服务集合;公共设施是向终端用户应用程序提供的一组共享服务接口;域接口是为应用领域服务而提供的接口;应用接口是由开发商提供的产品的接口,不属于OMG标准的内容。ORB提供了一种机制,通过这种机制,对象可以透明地发出请求和接收响应。 分布的、可以互操作的对象能够利用ORB构造应用。 第2章 分布式对象计算 ORB可看作是在对象之间建立客户/服务关系的一种中间件。基于ORB,客户可以透明地调用服务对象提供的方法,该服务对象可以与客户运行在同一台机器上,也可以运行在其他机器上通过网络与客户进行交互。ORB接收客户发送的请求,并负责在该软件总线上找到实现该请求的服务对象,然后完成参数、方法调用,并返回最终结果。 第2章 分布式对象计算 CORBA的发展历程为 (1) 1990年11月,OMG发表对象管理体系指南,初步阐明了CORBA的思想。 (2) 1991年10月,OMG推出1.0版,其中定义了接口定义语言(IDL)、对象管理模型以及基于动态请求的API和接口仓库等内容;1991年12月,OMG推出了CORBA 1.1版,在澄清了1.0版中存在的二义性的基础上,引入了对象适配器的概念,定义了IDL接口定义语言,开发出对象请求代理(ORB)中间件,在客户机/服务器结构中,ORB通过一定的应用程序接口(API),实 现对象之间的交互。 第2章 分布式对象计算 (3) 1994年12月OMG完成了CORBA2.0,提出了对象请求代理间协议(IIOP,Internet Inter-ORB Protocol),用以规范不同厂家的ORB之间的真正互通,同时增加了互操作性和对C及SmallTalk的匹配,OMG期望通过上述规范建立一种“连接世界的体系结构”。 (4) 1996年8月,OMG基于以前的升级版本,完成了2.0版的开发,该版本中重要的内容是IIOP的引入,用以实现不同厂商的ORB真正意义上的互通。 第2章 分布式对象计算 (5) 1998年9月,OMG发布了CORBA 2.3版,增加了支持CORBA对象的异步实时传输、服务质量规范等内容。目前,宣布支持CORBA 2.3版规范的中间件厂商包括Inprise(Borland)、Iona、BEA System等著名的CORBA产品生产商。 (6) 2001年9月,OMG发布了CORBA2.5版,在这个版本中,加入了一些新的内容,包括CORBA容错(Fault Tolerant CORBA),实时CORBA(Real-Time CORBA),并修改了部分CORBA Messaging和Portable Interceptors的内容。 第2章 分布式对象计算 (7) 2001年12月,OMG发布CORBA2.6版,在2.5版的基础上新增了一章“Secure Interoperability”,并对部分内容作了修改。 (8) 最新版本是2002年9月发布的CORBA 3.0版。 第2章 分布式对象计算 2.2.2 什么是CORBA 随着互联网技术的日益成熟,公众及商业企业正享受着高速、低价网络信息传输所带来的高品质数字生活。但是,由于网络规模的不断扩大以及计算机软硬件技术水平的飞速提高,给传统的应用软件系统的实现方式带来了巨大挑战。CORBA已经被证实是近年来网络技术发展中最重要的革新之一,它致力于解决当前信息系统存在的两大难题:难于快速集成现有软硬件系统和新的应用;开发客户/服务器程序困难。 第2章 分布式对象计算 首先,在企业级应用中,硬件系统集成商基于性能、价格、服务等方面的考虑,通常在同一系统中集成来自不同厂商的硬件设备、操作系统、数据库平台和网络协议等,由此带来的异构性给应用软件的互操作性、兼容性以及平滑升级能力带来了严重问题。 另外,随着基于网络的业务不断增多,传统的Client/Server模式的分布式应用方式越来越显示出在运行效率、系统网络安全性和系统升级能力等方面的局限性。 第2章 分布式对象计算 为了解决DCE中不同硬件设备和软件系统的互联,增强网络间软件的互操作性,解决传统分布式计算模式中的不足等问题,对象管理组织提出了公共对象请求代理体系结构,以增强软件系统间的互操作能力,使构造灵活的分布式应用系统成为可能。 正是基于面向对象技术的发展和成熟、客户/服务器软件系统模式的普遍应用以及集成已有系统等方面的需求,推动了CORBA技术的成熟与发展。作为面向对象系统的对象通信的核心,CORBA为当今网络计算环境带来了真正意义上的互联。 第2章 分布式对象计算 CORBA是一个分布式对象技术的规范,它是针对多种对象系统在分布式计算环境中如何以对象方式集成而提出的,它为对象管理定义了一个对象模型OMG参考模型(OMG Reference Model)及其框架结构。该模型由ORB、对象服务、公共设施、领域接口及应用对象等5个主要部分组成。该模型及其框架结构将面向对象技术与客户/服务器计算模式结合起来,有效地解决了对象封装和分布式计算环境中资源共享、代码可重用、可移植以及应用间的互操作性等问题。 从最顶层来看,CORBA规范指的是对象管理结构(OMA, Object Management Architecture),该结构如图 2.1所示的5部分组成。 第2章 分布式对象计算 图2.1 OMA参考模型应用接口 CORBA领域接口 对象请求代理(ORB)CORBA对象服务CORBA公共设施 第2章 分布式对象计算 (1) 对象请求代理(ORB)。ORB是CORBA的核心,它路由OMA结构中其他部件之间的请求,起到对象通信“软总线”的作用。ORB是构建分布式对象应用、在异构或同构环境下实现应用间互操作的基础。 (2) CORBA对象服务。CORBA对象服务(Object Services)是为使用和实现对象而提供的基本服务集合。在构建任何分布式应用时经常会使用到这些服务,而且这些服务独立于应用领域。例如生命周期服务定义了对象的创建、删除、拷贝和移动的方法,但它不规定如何在应用中实现这些对象。 第2章 分布式对象计算 CORBA对象服务由OMG COSS规范规定。COSS规范由一组接口(Interface)和服务行为描述构成,其接口一般使用OMG接口定义语言(IDL,Interface Definition Language)描述。目前COSS规范包括如下内容:命名服务(Naming Service)、事件服务(Event Service)、生命周期服务(Life Cycle Service)、持久对象服务(Persistent Object Service)、并发控制服务(Concurrency Control Service)、外部化服务(Externalization Service)、关系服务(Relationship Service)、查询服务(Query Service)、许可服务(Licensing Service)、属性服务(Property Service)、安全 服务(Security Service)和时间服务(Time Service)等。 第2章 分布式对象计算 (3) CORBA公共设施。CORBA公共设施(Common Facilities)提供了一组更高层的函数,这些函数包括用户界面、信息管理等方面的通信设施,为终端用户提供一组共享服务接口,例如综合文档、系统管理和电子邮件服务等。这些服务不像对象服务那么基本。 第2章 分布式对象计算 (4) CORBA领域接口。CORBA领域接口(Domain Interface)与特定的应用领域有关,例如制造业、金融业、通信行业等,它为应用领域提供接口。目前,OMG为产品数据管理(PDM,Product Data Management)应用制定了规范。在该规范中定义了8个使能器,描述了12个功能模块及其接口,明确了PDM系统与其他应用系统之间交互的方式。 (5) 应用接口。应用接口(Application Interface)是由销售商提供的、可控制其接口的产品,相当于传统的应用表示。OMG组织不对它们作标准化工作。应用接 口位于参考模型的最高层。 第2章 分布式对象计算 2.2.3 CORBA对象模型 对象系统是一系列对象的集合,它通过精心定义的封装接口将服务的请求者(客户)和服务的提供者相分离,尤其是让客户与诸如数据的表示和可执行代码等服务的具体实现相分离。 对象模型首先描述对客户有意义的概念,包括对象的产生、标识、请求和操作、类型以及特征标记(Signatures)等。其次,对象模型还要描述与对象实现有关的概念,包括方法、执行引擎和激活等。对象系统在一些概念上,做了很明确详细的规定,但对对象的实现只是建议性的,其目的在于最大程度上使用不 同的对象技术、方法来实现对象。 第2章 分布式对象计算 对象的语义包括对象、请求、对象的创建和删除、类型、接口及属性等。 CORBA定义了一个软总线框架,制定了有标准接口的对象服务,利用CORBA我们可以集成和组合大型、复杂的分布式应用系统。CORBA对象参考模型描述了应用系统中遵循的概念化的基础结构。 第2章 分布式对象计算 1CORBA的对象参考模型 CORBA的对象参考模型的基础结构如图2.2所示。 图中对象实现是指对象功能的具体实现,它将数据和施加在数据上的操作(或称为方法)捆绑在一起,封装在对象中,客户所能看到的只是对象的接口,因此对象实现的改变不会对客户程序产生任何影响。客户调用对象中的操作(或方法),首先要找到对象,即要找到该对象的对象引用(Object Reference),通过组件访问方法引用对象实现。 第2章 分布式对象计算 图2.2 CORBA对象参考模型 第2章 分布式对象计算 CORBA采用接口定义语言(IDL)进行对象建模、IIOP进行客户和服务器之间通信。 IIOP即因特网ORB互通协议,它是一个和其他网络协议一起运行在TCP/IP 之上的标准网络协议,使不同供应商提供的不同产品之间实现交互操作。 第2章 分布式对象计算 2CORBA的对象引用 一个应用组件通过两种机制访问另一组件中的对象:一种是通过值来传递对象,另一种是通过对象引用来传递对象。通过值传递对象机制的实现过程如图2.3(a)所示。 (1) 被调用的进程q将对象x本身从远端通过网络以0/1序列码的形式传递到主进程p中,建立对象x的副本; (2) 对象x的副本执行所调用的操作。 对象引用传递对象方法中对象本身仍留在原处,通过对象引用调用对象中的操作,由对象本身执行, 实现过程如图2.3(b)所示。 第2章 分布式对象计算 图2.3 对象传递方法 (a) 通过值传递;(b) 通过对象引用本地 执行 对象x的副本进程p 进程q传递副本 进程p 进程q传递引用 执行 操作调用操作返回结果对象引用(a) 对象x 对象x(b) 第2章 分布式对象计算 (1) 进程q将对象x的对象引用传给主调进程p; (2) 进程p根据对象引用来调用对象x中的操作,主调进程p只是通过对象引用看到这个对象,但并不拥有它; (3) 调用操作由远端对象x来执行; (4) 执行结果从远端送回主调进程p。 CORBA通过对象引用机制来实现对象的调用。按照实现的基本过程,CORBA对象服务的实现方式分为两种: 对象的命名引用方式和字符串化对象引用方式。 第2章 分布式对象计算 2.2.4 CORBA的优势与应用 1CORBA的优势 CORBA分布式对象技术标准有许多优势: (1) CORBA在面向对象的标准化和互操作上迈出了坚实的一步。使用CORBA,用户能在不知道软件和硬件平台以及网络位置的情况下透明地获取信息。 (2) CORBA自动进行许多网络规划任务,如对象注册、定位、激活,多路径请求,分帧和错误处理机制,并行处理以及执行操作。 第2章 分布式对象计算 (3) 作为面向对象系统中的通信核心,CORBA为当今的计算环境中带来了真正意义上的互联。 (4) CORBA定义了一种面向对象的软件构件构造方法,使不同的应用可以共享此软件构件。 (5) 每个对象都将其内部操作细节封装起来,同时又向外界提供了精确定义的接口,从而降低了应用系统的复杂性,也降低了软件的开发费用。 第2章 分布式对象计算 (6) CORBA的平台无关性实现了对象的跨平台引用,开发人员可以在更大地范围内选择最实用的对象加入到自己的应用系统中。 (7) CORBA的语言无关性使开发人员可以在更大范围内相互利用别人的编程技能和成果,是实现软件复用的实用化工具。 第2章 分布式对象计算 2CORBA的应用 CORBA的应用领域广泛,通常应用于以下领域: (1) 存取来自现行桌面应用程序的分布信息和资源; (2) 使现有业务数据和系统成为可供利用的网络资源; (3) 为某一特定业务定制的功能和能力来增强现行桌面工具和应用程序; (4) 改变和发展基于网络的系统以反映新的拓扑结构或新资源; 第2章 分布式对象计算 (5) 目前CORBA主要适合于分布式跨平台的信息管理应用。比较典型的应用是大规模的企业信息管理和事务处理应用,以及行业解决方案(数据库中的中间件技术)和在网管系统中多厂商互连互通解决方案。 CORBA应用的体系结构很多,常用的有三层式架构CORBA或EJB-CORBA互用等形式。 第2章 分布式对象计算 1三层式架构CORBA 一个典型的CORBA中间件系统是一个3层结构。CORBA客户机与CORBA服务器通讯,服务器与某个数据库或传统系统通讯,如图2.4所示。 第2章 分布式对象计算 图2.4 CORBA客户机-服务器体系结构 CORBA客户机 数据库IIOP CORBA服务器 第2章 分布式对象计算 2EJB-CORBA互用的体系结构 CORBA与J2EE组件结合的新体系结构如图2.5所示。在这个系统中,J2EE组件被引入到客户机和CORBA服务器之间。客户机从一个CORBA客户机转变成一个RMI客户机,客户机与J2EE组件通讯,随后J2EE组件再与CORBA服务器通讯。J2EE组件等效于新的CORBA客户机。J2EE组件还可以与其他J2EE组件通讯。 第2章 分布式对象计算 图2.5 J2EE组件与CORBA对象交互操作的体系结构 IIOPRMI/IIOP J2EE容器RMI/IIOPCORBA客户端 EJB CORBA服务器J2EE容器EJB 第2章 分布式对象计算 在图2.5所示的体系结构中,J2EE组件与CORBA服务器协同工作,EJB位于客户机和CORBA服务器之间。图2.6显示了EJB-CORBA对象互用的体系结构更详细的视图。客户机使用RMI/IIOP与EJB通讯,而EJB使用IIOP 与CORBA服务器通讯。 所有的CORBA通讯都封装在一个称为适配器对象的Java辅助器类中。这个适配器对象通常是一个Java Bean,而不是RMI-IIOP转换桥。 第2章 分布式对象计算 图2.6 EJB-CORBA对象互用的体系结构 IIOPRMI/IIOP 命名服务CORBA适配器查找 绑定业务方法CORBA客户端 EJB CORBA服务器 第2章 分布式对象计算 底部的方框显示的是对象命名服务。CORBA对象在实例化时,把自己绑定到命名服务上。适配器对象首先在命名服务中查找该CORBA服务器对象,获得它的引用。适配器对象获得指向服务器的引用后,就可以调用CORBA服务器对象的业务方法了。为了调用服务器的业务方法,适配器对象可以使用两种调用模型:静态调用接口(SII,Static Invocation Interface)或动态调用接口(DII,Dynamic Invocation Interface)。SII使用由IDL编译器生成的客户机存根来调用方法,因此EJB必须能访问存根。通常,存根与EJB封装在一起来使用。DII无需使用存根,在运行时与服务器对象进行绑定。 第2章 分布式对象计算 2.3 CO RBA的基本结构 CORBA中客户向对象实现发送请求的过程如图2.7所示。 其中客户是指使用某个对象来实现某种操作的实体,对象实现是指具体实现这一对象的代码和数据。ORB提供了如下支持分布式处理的机制:为请求查找具体的对象实现、让对象实现做好接受请求的准备、传送构成请求的数据等。客户所看到的接口完全独立于对象所在的物理位置、实现对象的编程语言以及在对象 接口中没有反映出来的其他特性。 第2章 分布式对象计算 图2.7 通过对象请求代理传送的请求 客户 对象实现ORB 请求 第2章 分布式对象计算 CORBA的接口结构如图2.8所示。其中条形框表示ORB所提供的接口,箭头表示这个ORB是否被调用或者正在通过接口执行下一个调用。 第2章 分布式对象计算 图2.8 ORB接口结构图 ORB核心动态调用接口 客户IDL码根 ORB接口 IDL静态框架 动态框架 对象适配器对象实现用于所有ORB实现的同一接口对于每个对象类型都有程序码根和一个程序框架对象适配器接口,可能有多个对象适配器依存于ORB的接口 向上调用向下调用 第2章 分布式对象计算 ORB接口结构图揭示了CORBA工作的基本原理。 ORB是建立对象之间客户/服务器关系的中间件。它使得某个对象可以透明地向其他对象发出请求或接受其他对象的响应。ORB通过接口定义语言(IDL,Interface Definition Language)程序框架或者动态程序框架来定位响应的代码实现、传送参数以及对对象实现的传送控制。接口和适配器都有其特定的程序框架,在执行请求时,对象实现可以通过对象适配器获得ORB提供的服务,这一请求完成后,控制权和输出结果返回客户。 第2章 分布式对象计算 客户通过访问对象引用,了解对象的类型以及所需执行的操作,并在此基础上执行请求。客户通过发送请求使用对象所实现的服务,客户方可以有三种具体实现方式:使用静态OMG IDL码根,使用动态调用接口,以及为了调用某些特殊功能,用户可能需要与ORB进行直接交互。 客户端可以看到的接口有:静态OMG IDL码根、动态调用接口、ORB接口和接口库。其中静态OMG IDL码根为客户提供静态调用方式,这些经过预编译的IDL码根定义了客户程序如何调用服务器程序的相应服务,从客户角度看,就如同一般的调用,是远程服务 器对象的代理; 第2章 分布式对象计算 动态调用接口允许用户在运行过程中查找并加以调用;ORB接口是一个包含本地服务的接口,这些服务可以直接为应用程序所使用。接口库是一个运行库,包含由IDL定义接口的机器可读版本,接口库还是ORB的一个动态元数据库,ORB上的组件可以动态访问、存储、修改元数据。 对象的实现同样有三种方式:通过OMG IDL产生程序框架(Skeleton)、通过动态程序框架(Dynamic Skeleton)接收作为上行调用(up-Call)的请求以及在处理请求或其他任何时候,对象实现均可以调用对象适配 器和ORB。 第2章 分布式对象计算 服务器方能看到的CORBA系统接口有:服务器程序框架、动态程序框架接口、对象适配器、ORB接口和实现库。其中服务器程序框架为服务器程序的每个服务提供静态接口,同静态OMG IDL码根一样,服务器程序框架也是由IDL编译器产生的;动态程序框架接口允许对象调用的动态处理;对象适配器位于ORB核心通信服务顶端,代替服务对象接受服务请求;ORB接口可以直接为应用程序所使用;实现库存储服务器程序支持的类、实例化对象等。 第2章 分布式对象计算 对象的实现可以选择合适的适配器,对象适配器的选择由对象所需要的服务而定。 图2.9为显示客户和对象实现如何使用接口和实现信息。用OMG IDL或接口库方式来定义接口,该定义用于产生客户码根和对象实现的程序框架。在安装时把对象实现信息放入实现资源库中,以备请求使用。 第2章 分布式对象计算 图2.9 接口与实现资源库IDL定义 对象实现接口库 码根 程序框架 实现安装实现库 客户 第2章 分布式对象计算 2.3.1 对象请求代理(ORB) 1ORB的作用 在传统的基于客户机/服务器模式的应用程序开发过程中,项目开发人员遵循公开的标准或自由设计模块间的协议,这样的协议依赖于网络类型、实现语言、应用方式等。引入ORB后,客户只要遵循服务对象的对外接口标准向服务对象提出业务请求,由ORB在分布式对象间建立客户-服务对象关系。总结起来,ORB的作用包括: 第2章 分布式对象计算 (1) 接受客户发出的服务请求,完成请求在服务对象端的映射; (2) 自动设定路由寻找服务对象; (3) 提交客户参数; (4) 携带服务对象计算结果返回客户端。 第2章 分布式对象计算 由图2.7可以看出,客户向服务对象的实现发出事务请求,其中客户是向对服务对象发出方法请求的实体,服务对象应包括该方法的数据资源以及实现代码。对象请求代理的作用就是定位服务对象,接收客户发出的服务请求并将服务对象的执行结果返回给客户。请求发出后,客户对象采用轮询等方式来获取服务对象计算的结果。 第2章 分布式对象计算 2ORB的结构及类型 ORB提供了对象请求与回答的通信机制,使CORBA应用开发者无需关心具体通信细节,而把注意力集中到实际的应用程序逻辑中去。在ORB结构中,ORB并不需要作为一个单独的组件来实现,而是通过一系列接口和接口定义中说明要实现操作的类型,确定提供的服务和实现客户与服务对象通信的方式。 通过IDL接口定义、接口库或适配器的协调,ORB可以向客户机和具备服务功能的对象实现提供服务。作为CORBA体系结构的核心,ORB可以实现如下三种类型的接口: 第2章 分布式对象计算 (1) 对于所有的ORB实现具有相同的操作; (2) 针对特定类型对象的操作; (3) 与对象实现类型有关的操作。 基于ORB实现的不同类型接口,一个客户端请求可以同时访问多个由不同ORB实现通信管理的对象引用。在实际应用中,只要遵循公共的ORB体系结构,程序设计就可以选择ORB的多种实现方式,其中包括: 第2章 分布式对象计算 (1) 客户和实现驻留(Client-Implementation Resident)的ORB:采用驻留在客户端和以服务对象实现程序的方式实现ORB。在这种实现方式下,客户端可以通过码根程序,以位置透明的方式向具体的实现对象提出服务请求,实现客户与服务对象的通信。 (2) 基于服务(Server-Based)的ORB:客户对象和实现对象均可以与一个或多个服务对象进行通信,服务对象的功能是将请求从客户端发送到对象实现。在这种方式中,ORB的作用是完成客户对象与实现对象的通信,为对象之间的交互提供服务。 第2章 分布式对象计算 (3) 基于系统(System-Based)的ORB:在这种实现方式中,ORB被操作系统认为是系统所提供的一项基本服务。由于操作系统了解调用方与服务对象的位置,因而可以充分地实现ORB功能的优化。 (4) 基于库(Library-Based)的ORB:如果认为对象实现可以共享,则可以将实现功能放入实现库(Implementation Repository)中,从而创建基于库的ORB。 第2章 分布式对象计算 3ORB中的主要方法 客户端和服务对象端均可以自由选择使用ORB对象中定义的方法来实现操作。下面举例说明ORB对象中的重要方法。 1) ORB ORB_init(inout arg_list argv,in ORBid orb_identifier) 作用:ORB初始化。 2) String object_to_string(in Object obj) 作用: 将对象的引用转换成客户可以用字符串方式存储的对象信息。 第2章 分布式对象计算 3) Object string_to_object(in String str) 作用:方法object_to_string(in Object obj)的逆过程。将以字符串方式存储的对象转换成对对象类型的引用。 4) Object resolve_initial_references(in ObjectID identifier) 作用:获取初始对象引用。 第2章 分布式对象计算 5) Policy get_policy(in PolicyType policy_type) 作用:返回指定类型的服务策略对象。 作为公共对象请求代理体系结构中的核心内容,ORB提供了相当丰富的方法。读者可以查阅相关资料详细了解ORB中的其他方法。 第2章 分布式对象计算 4服务请求的实现方式 关于对象请求的实现方式,CORBA规范中定义客户程序可以用动态调用接口(DII,Dynamic Invocation Interface)方式或通过OMG IDL文件经编译后在客户端生成的码根方式提出服务请求。这两种实现方式的区别在于通过OMG IDL码根文件方式实现的调用请求中,客户能够访问的服务对象方法取决于服务对象所支持的接口;而动态调用接口调用方式则与服务对象的接口无关。尽管实现调用请求的方式有所区别,但客户发出的请求服务调用的语义是相同的,服务对象不去 分析服务请求提出的方式。 第2章 分布式对象计算 ORB通过IDL码根方式或动态调用接口(DII)方式定位服务对象的实现代码、传递服务对象应用参数以及完成对请求传送方式的控制。服务对象的实现通过对象适配器提供对客户请求的服务。 第2章 分布式对象计算 从对服务请求调用方式的分析可以看出: 服务对象接口的定义在整个CORBA系统服务功能的实现中起着相当重要的作用。那么如何实现服务对象的功能接口呢?CORBA规范中定义了两种接口实现方式:第一种形式是利用OMG IDL接口定义语言对接口进行描述。IDL语言有详细的语法规则。经过对所实现功能的系统分析,利用IDL,依据服务对象可能实现的服务以及服务中需要的参数,对接口进行定义。另外一种方式是将接口放入接口仓库(Interface Repository)中,在运行期间对接口库中的接口进行访问。 第2章 分布式对象计算 2.3.2 OMG IDL 从本质上讲,OMG IDL接口定义语言不是作为程序设计语言体现在CORBA体系结构中的,而是用来描述产生对象调用请求的客户对象和服务对象之间的接口语言。OMG IDL文件描述数据类型和方法框架,而服务对象则为一个指定的对象实现提供上述数据和方法。 第2章 分布式对象计算 OMG IDL文件描述了服务器提供的服务功能,客户机可以根据该接口文件描述的方法向服务器提出业务请求。在大多数CORBA产品中都提供IDL到相关编程语言的编译器。程序设计人员只需将定义的接口文件输入编译器,设定编译选项后,就可以得到与程序设计语言相关的接口框架文件和辅助文件。IDL文件的应用过程如图2.10所示。 第2章 分布式对象计算 图2.10 IDL文件应用过程OMG IDL编译器OMG IDL文件接口库客户端码根 服务器框架客户端应用 服务器应用 第2章 分布式对象计算 在语法规则方面,类似于C+或Java中关于接口或对象的定义,OMG IDL增加了一些构造方法支持IDL特有的方法调用机制。OMG IDL只是一种说明性的语言,支持C+语法中的常量、类型和方法的声明。采用OMG IDL这样的说明性语言,其目的在于克服特定编程语言在软件系统集成及互操作方面的限制,这正是CORBA的诱人之处,同时也体现了采用CORBA构造分布式应用程序在网络时代的强大生命力。OMG IDL已经为C、C+、Java等主要高级程序设计语言制定了IDL到高级编程语言的映射标准。项目开发人员可以根据需要选择自己最熟悉的编程语言来独立开发基于CORBA的应用,而对软件 系统的互操作能力不产生影响。 第2章 分布式对象计算 1OMG IDL的语法规则 OMG IDL文件举例。module Compute typedef double radius; typedef long times; interface PI double getResult( in radius aRadius, in times time); 第2章 分布式对象计算 上述接口定义文件主要用于客户端向服务对象提出请求:计算值。因此,模块Compute中定义了直径(aRadius)、迭代次数(times)以及接口PI,接口PI中定义了一个方法getResult(),以圆的aRadius和times作为该方法的输入参数。 第2章 分布式对象计算 2OMG IDL词法规则 OMG IDL采用ASCII字符集构成接口定义的所有标识符。标识符由字母、数字和下划线的任意组合构成,但第一个字符必须是ASCII字母。IDL认为大写字母和小写字母具有相同的含义,例如anExample和AnExample是相同的。 与C+和Java类似,采用以“/*”开始,以“*/”结束来注释一段代码;或以“/”开始,注释从“/”开始直至行尾的所有内容。 第2章 分布式对象计算 另外,IDL保留了47个关键字,程序设计人员不能将关键字用作变量或方法名。需要注意的是关键字的大小写,例如: typedef double context; /错误:定义的变量context是关键字 typedef double CONTEXT; /错误:CONTEXT与关键字context冲突 第2章 分布式对象计算 3数据类型 (1) 基本数据类型:OMG IDL基本数据类型包括short、long和相应的无符号(unsigned)类型,表示的字长分别为16和32位。 (2) 浮点数类型:OMG IDL浮点数类型包括float、double和long double类型。其中float表示单精度浮点数,double表示双精度浮点数,long double表示扩展的双精度浮点数。 第2章 分布式对象计算 (3) 字符和超大字符类型:OMG IDL定义字符类型char为面向字节的集中编码的单字节字符;定义类型wchar为从任意字符集中编码的超大字符。 (4) 逻辑类型:用boolean关键字定义的一个变量,取值只有true和false。 (5) 八进制类型:用octet关键字定义,在网络传输过程中不进行高低位转换的位元序列。 (6) any数据类型:引入该类型用于表示OMG IDL中任意数据类型。 第2章 分布式对象计算 4常量 OMG IDL用const关键字声明一个常量,用于模块(Module)或接口(Interface)中定义保持不变的量,如: const double PI = 3.1415926; 在IDL中,可以定义long、unsigned long、unsigned short、char、boolean、float、double、string类型的常量。 第2章 分布式对象计算 5构造数据类型 类似于C和C+的语法规则,OMG IDL中构造数据类型包括结构、联合、枚举等形式。如下例: (1) 结构类型: typedef long GoodsNumber; struct GoodsNumber number; string name; float price; 第2章 分布式对象计算 (2) 联合类型: union stockIn switch( short ) case 1: stocker : long; case 2: goodsName1 : string; case 3: goodsName2 : string; (3) 枚举类型: enum GoodsStatus GOODS_SALED, GOODS_INSTOCK; 第2章 分布式对象计算 6数组类型 OMG IDL的数组类型提供了多维定长、统一数据格式的数据存储方式数组。每一维的长度必须在定义时给定,所有数据单元必须存储相同类型的元素。如下例定义一个长度为20100的整数数组: typedef long aDimension20100; 第2章 分布式对象计算 7模板(template)类型 OMG IDL提供两种类型的模板: (1) 序列(sequence)类型:用该方法定义长度可变的任意数值类型的存储序列,通常在定义时可以指定长度,也可以不指定,如: typedef sequence aSequence; /长度定义为80 typedef sequence anotherSequence; /长度不定 第2章 分布式对象计算 (2) 字符串(string)序列:同样对于字符串序列类型,也有两种定义方式: typedef string aName; /长度定义为80 typedef string anotherName; /长度不定 第2章 分布式对象计算 8接口(interface) 接口作为服务对象功能的详细描述,封装了服务对象提供服务方法的全部信息,客户对象利用该接口获取服务对象的属性、访问服务对象中的方法。 接口用关键字interface声明,其中包含的属性和方法对所有提出服务请求的客户对象是公开的,如下例: 第2章 分布式对象计算 interface JobManager readonly attribute string FirstName; attribute string status; 第2章 分布式对象计算 9接口的继承 与C+和Java中类的继承类似,OMG IDL中关于接口的继承分为两种类型: (1) 单继承: 一个接口继承另一个接口的属性及方法特征; (2) 多继承: 一个接口继承两个或两个以上接口的属性及方法特征。 用继承关系编写接口定义时,如果在接口定义之前该接口的父接口没有定义,则需要在定义接口之前先声明父接口,即所谓的前置声明(Forward Declaration)。下面举例说明接口继承。 第2章 分布式对象计算 在已经定义了人力资源管理接口JobManager后,由于实际需要,还要根据该接口定义资源服务接口,而该接口应继承管理接口的特征。因此,以管理接口为父对象定义新的接口JobServer: interface JobServer : JobManager void MailToManager( in long ManagerId, out string status); JobServer : JobManager表明接口JobServer继承JobManager的对象特征。 第2章 分布式对象计算 10异常处理(Exception) 与C+和Java的语法规则类似,CORBA IDL同样提供了异常处理机制,称为引发异常(Raising an Exception)。CORBA本身定义了一部分由调用请求或ORB传递引发的异常,称为系统异常(System Exception)。因此,在OMG IDL中定义的异常通常称为“自定义异常”。 OMG IDL中用Exception关键字定义用户异常,在定义的方法后面加上raise关键字来声明,如果符合异常的触发条件,则引发定义类型的异常。如下例所示: 第2章 分布式对象计算 enum ErrorStatus Fatal,Important,Slight,NoMeaning; Exception ReasonOfMail ErrorStatus status; interface JobManager string QueryJobStatus( in long Number, out string property) raises (ReasonOfMail); 第2章 分布式对象计算 11定义方法传递的上下文 在前面曾提到过上下文,上下文在接口定义的方法中是如何传递的呢?上下文对象中包括一个称为特征名-特征值的名值对,在方法中使用context关键字定义。ORB在每次客户机发出调用请求时,在对象实现中匹配特征值。如下例所示: string QueryJobStatus( in long Number, out string property) 第2章 分布式对象计算 raise(ReasonOfMail) context(“who”); 按照以上定义,执行QueryJobStatus方法时,ORB在服务对象实现端的上下文序列中匹配特征名为“who”的特征值。 第2章 分布式对象计算 2.3.3 OMG IDL到编程语言的映射 CORBA规范中定义了OMG IDL语言到具体编程语言的映射,目前的映射包括了C、C+、SmallTalk、Ada95和Java等,适用多种编程的应用软件实体,体现了语言的异构性。语言映射包括对该编程语言所用到的数据类型的定义,以及一些通过ORB能够进行对象访问的函数接口,包括客户方码根接口的结构(针对非面向对象语言)、动态调用接口的结构、服务端程序框架对象适配器以及直接的ORB接口结构。 第2章 分布式对象计算 语言映射同时也定义了对象调用和客户的控制线程之间的交互和实现。 不同的面向对象或非面向对象编程语言可以采用各自喜欢的不同方式访问CORBA对象,面向对象语言可能将CORBA对象看作编程语言对象,即使是非面向对象的编程语言,也可以将对象引用、方法名字的精确ORB表示隐蔽起来。对所有的ORB实现,从OMG IDL到一种特定编程语言的映射方法应该是相同的。 第2章 分布式对象计算 2.3.4 ORB接口(ORB Interface) ORB接口是ORB核心给出的界面。ORB接口同时为客户方和对象实现方所用,提供了一些只能由ORB内核提供的服务ORB接口函数,包括对象引用操作、ORB初始化、对象适配器初始化和获取初始对象引用等。 第2章 分布式对象计算 ORB接口不依赖对象接口或对象适配器执行ORB系统功能。ORB接口提供一组标准的API来实现一部分客户端和服务器端公共需要的功能,ORB接口中的这些操作对于所有ORB和所有对象实现都是相同的,并能为所有对象的客户和实现执行。 ORB接口、动态调用接口和动态程序框架的相同点在于,他们都是一组标准的API,因此尽管ORB可能由不同的厂商来实现,但对这部分API的使用却是不变的。此外,这些API的使用方式与普通CORBA调用方式一样,使程序员认为服务器端存在相应的对象在提 供实现,实际上这些对象都是在ORB内部实现的。 第2章 分布式对象计算 2.3.5 客户方码根(Client Stub) 客户方码根为客户提供静态调用方式。这些经过预编译的IDL码根定义了客户程序如何调用服务器程序的相应服务。客户方的码根负责把用户的请求进行编码发送到对象实现端,并对接收到的处理结果进行解码,把结果或异常信息返回给用户,从客户角度看,就如同是一个本地调用,是远程服务器对象的代理。 第2章 分布式对象计算 对于非面向对象语言的映射,每一个IDL接口类型都将有一个编程接口支持对生成的码根的调用。通常,码根使用一种简单的方式,以便访问OMG IDL定义的对象操作,这种方式使得编程人员只要熟悉OMG接口定义语言和所映射的编程语言即可。该码根利用那些对ORB核心专用的、优化的接口调用ORB的其他部分。如果不只一个ORB,则针对不同的ORB就有不同的码根。在这种情况下,ORB与语言映射必须协调一致以便
展开阅读全文