CORBA的基本内容(上)
(本文转载自软件工程专家网www.21cmm.com)
苏洋
回顾上一讲中在介绍CORBA体系结构时,曾强调CORBA在提高组件重用性、增强分布计算功能方面具有的突出特点:
● 引入中间件作为事务代理;
● 客户程序与服务器程序完全分离;
● 与面向对象的建模概念相结合;
● 引入接口定义语言描述服务对象功能。
CORBA规范只是描述了CORBA系统中各个构件的基本情况以及构件在系统中承担的任务,并没有从功能实现的细节上规定必须如何建立一个基于CORBA规范的软件系统产品。这样,对于基于CORBA的软件产品开发而言,程序设计人员可以自由地选择实现方式,但前提是遵循规范中各个构件的实现原则。在本讲和下一讲中,将详细介绍CORBA中各个构件的主要内容。
对象请求代理(ORB)
1. 对象请求代理(ORB,Object Request Broker)的作用
在传统的基于客户机/服务器模式的应用程序开发过程中,项目开发人员遵循公开的标准或自由设计模块间的协议,这样的协议依赖于网络类型、实现语言、应用方式等。引入ORB后,客户只要遵循服务对象的对外接口标准向服务对象提出业务请求,由ORB在分布式对象间建立客户-服务对象关系。总结起来,ORB的作用包括:
● 接受客户发出的服务请求,完成请求在服务对象端的映射;
● 自动设定路由寻找服务对象;
● 提交客户参数;
● 携带服务对象计算结果返回客户端。
图1 客户服务请求示意图
由图1可以看出,客户(Client)向服务对象的实现(Object Implementation)发出事务请求,其中客户是欲对服务对象发出方法请求的实体,服务对象应包括该方法的数据资源以及实现代码。对象请求代理的作用就在于定位服务对象,接收客户发出的服务请求并将服务对象的执行结果返回给客户。请求发出后,客户对象采用轮询等方式以获取服务对象计算的结果。
2. ORB的结构及类型
ORB通过一系列接口和接口定义中说明的要实现操作的类型,确定提供的服务和实现客户与服务对象通信的方式。通过IDL接口定义、接口库或适配器(Adapter)的协调,ORB可以向客户机和具备服务功能的对象实现(Object Implementation)提供服务。作为CORBA体系结构的核心,ORB可以实现如下三种类型的接口:
● 对于所有的ORB实现具有相同的操作;
● 针对特定类型对象的操作;
● 与对象实现类型有关的操作。
基于ORB实现的不同类型接口,一个客户端请求可以同时访问多个由不同ORB实现通信管理的对象引用。在实际应用中,只要遵循公共的ORB体系结构,程序设计可以选择ORB的多种实现方式,其中包括:
(1)客户和实现驻留(Client-Implementation Resident)ORB:采用驻留在客户和服务对象实现程序的方式实现ORB。在这种实现方式下,客户端可以通过桩(Stub)程序,以位置透明的方式向具体的实现对象提出服务请求,实现客户与服务对象的通信。
(2)基于服务(Server-based)ORB:客户对象和实现对象均可以与一个或多个服务对象进行通信,服务对象的功能是将请求从客户端发送到对象实现。在这种方式中,ORB的作用是完成客户对象与实现对象的通信,为对象之间的交互提供服务。
(3)基于系统(System-based)ORB:在这种实现方式中,ORB被操作系统认为是系统所提供的一项基本服务。由于操作系统了解调用方与服务对象的位置,因而可以充分地实现ORB功能的优化。
(4)基于库(Library-based)ORB:如果认为对象实现可以共享,则可以将实现功能放入实现库(Implementation Repository)中,从而创建基于库的ORB。
3. ORB中的主要方法
客户端和服务对象端均可以自由选择使用ORB对象中定义的方法来实现操作。下面举例说明ORB对象中的重要方法:
(1)ORB ORB_init(inout arg_list argv,in ORBid orb_identifier)
作用:ORB初始化方法。
(2)String object_to_string(in Object obj)
作用: 将对对象的引用转换成客户可以用字符串方式存储的对象信息。
(3)Object string_to_object(in String str)
作用:上述方法的逆过程。将以字符串方式存储的对象转换成对对象类型的引用。
(4)Object resolve_initial_references(in ObjectID identifier)
作用:获取初始对象引用。
(5)Policy get_policy(in PolicyType policy_type)
作用:返回指定类型的服务策略对象。
作为公共对象请求代理体系结构中的核心内容,ORB提供了相当丰富的方法。读者可以查阅相关资料详细了解ORB中的方法。
4. 服务请求的实现方式
关于对象请求的实现方式,CORBA规范中定义客户程序可以用动态调用接口(DII,Dynamic Invocation Interface)方式或通过OMG IDL文件经编译后在客户端生成的桩(Stub)方式提出服务请求。这两种实现方式的区别在于通过OMG IDL桩(Stub)文件方式实现的调用请求中,客户能够访问的服务对象方法取决于服务对象所支持的接口;而动态调用接口调用方式则与服务对象的接口无关。尽管实现调用请求的方式有所区别,但客户发出的请求服务调用的语义是相同的,服务对象不去分析服务请求提出的方式。
ORB通过IDL客户桩(Stub)方式或动态调用接口(DII)方式定位服务对象的实现代码、传递服务对象应用参数以及完成对请求传送方式的控制。服务对象的实现(Object Implementation)通过对象适配器(Object Adapter)提供对客户请求的服务。客户对服务器端方法的调用方式见图2。
图2 客户调用服务请求的实现方式
从以上对服务请求调用方式的分析可以看出: 服务对象接口的定义在整个CORBA系统服务功能的实现中起着相当重要的作用。那么如何实现服务对象的功能接口呢?CORBA规范中定义了两种接口实现方式:第一种形式是利用OMG IDL接口定义语言对接口进行描述。IDL语言有详细的语法规则(讲座将在第五讲对该语言的语法规则进行详细讲解)。这样,经过对所实现功能的系统分析,利用IDL,依据服务对象可能实现的服务以及服务中需要的参数,对接口进行定义。另外一种方式是将接口放入接口仓库(Interface Repository)中,在运行期间对接口库中的接口进行访问。