ORB结构



ORB是一个中间件(middleware),它可以建立对象之间的client/server关系。通过ORB,一个client可以透明的引用同一台机器上或网络上的一个server对象的方法。ORB解释该调用并负责查找一个实现该请求的对象,找到后,把参数传给该对象,调用它的方法,最后返回结果。client并不清楚该对象的位置,它的编程语言,它的操作系统以及其它不是对象接口的系统信息。 ORB能实现分布环境中位于不同机器上的应用之间的互操作以及多对象系统之间的无缝连接。

在传统的client/server)应用中,开发者使用自己设计的标准或通用标准来定义设备之间的协议。协议定义与实现的语言、网络传输及其它因素有关。ORB简化了这一过程,它使用IDL来定义应用接口之间的协议。ORB允许程序员选择通用操作系统,运行环境和编程语言。更重要的是,它能集成现存元素。

2.1 ORB结构


图 2-1 通过ORB传递请求

图2-1显示了一个client向对象实现发送一个请求。Client是一个想对对象进行操作的一个实体,对象实体是实现对象的代码和数据。ORB负责根据一个请求来定位一个对象,安排对象实现准备接受请求,与请求的数据通讯。Client的接口与对象的位置完全,实现对象的语言及其它不在对象接口反映出来的方面等无关。

图2-2显示了单个ORB的结构。用斜条文的矩形框表示ORB的接口, 箭头表示调用ORB或ORB使用接口把信息向上传递。


图 2-2 ORB接口结构

Clinet使用Dynamic Invocation interface (与目标对象的接口无关)或OMG IDL stub (与目标对象接口有关的stub)来发出请求。由于某种原因,Client也可以直接与ORB联系。对象实现使用OMG IDL生成的skeleton或动态 skeleton以向上传送(up-call)的方式接受请求。对象实现也可以调用Object Adapter和ORB。可以用两种方式来定义对象接口:一是用OMG Interface Definition Language (OMG IDL)来定义接口。该语言根据可能对对象进行的操作和这些操作使用的参数来定义对象类型。第二种方法是,把接口(interface)放入Interface Repository service中; 该服务把接口中的元素描述成一个对象。任何能实现ORB的软件中,Interface Definition Language (可能根据文档的内容而改变)和Interface Repository具有相同的作用。一个client要使用Object Reference完成请求,它必须知道对象的类型的及具体的操作。Client初始化请求有两种方法,一是通过调用目标对象的stub routines,二是动态的创造请求(如图2-3所示)。


图 2-3 Client使用Stub 或Dynamic Invocation Interface

不论使用Stub还是Dynamic Invocation Interface来发出请求具有相同的语义,信息的接收者不能分辨出该请求是使用哪种方法来传递的。ORB确定适当的实现代码,传递参数,通过IDL skeleton或dynamic skeleton (如图Figure 2-4 所示)把控制传给Object Implementation。每一个接口和object adapter 使用不同的Skeletons。为了完成请求,object implementation 可能通过Object Adapter 使用来自ORB的服务。当完成请求后,控制和输出结果返回给client。


图 2-4 Object Implementation 接受请求

Object Implementation选择使用何种Object Adapter。它是根据Object Implementation 需要服务的种类来确定的。图2-5 显示了clients和object implementations如何使用接口和实现信息。用OMG IDL或Interface Repository来定义接口;该定义用于产生client Stubs和object implementation Skeletons。


图 2-5 Interface 和 Implementation Repositories

在安装时把object implementation 信息放入Implementation Repository中,以备请求使用。

2.2 ORB结构中的主要构件


图2-6 CORBA ORB结构

2.2.1 Object Implementation(对象实现): 它定义了实现一个CORBA IDL接口的操作。它可以用各种语言来写,如C, C++, Java, Smalltalk和Ada。


图2-6 典型的Object Implementation 结构

2.2.2 Client(客户): 这是一个程序实体,它调用了某一个对象实现中操作。对调用这来讲,访问远程对象server应该是透明的。它应该和调用对象中的方法一样简单,如,obj->op(args)。

Client只能根据对象的接口了解对象的逻辑结构,虽然,我们一般都把client看作是一个程序或一个进程,但是,知道一个client都是某一个对象有关的。例如,一个对象的实现可能是其他对象的client。


图 2-7 典型的Client结构

Client通过语言映射(language mapping)来使用对象和ORB 接口。当这种映射关系改变时,不需要改变Client。Client不需要了解对象的实现方式,对象适配器及ORB。

2.2.3 Object Request Broker(ORB):

ORB提供了一种机制,能实现client请求与目标对象实现之间的透明通信。它使得client请求就象一个本地过程调用一样。当一个client引用一个操作,ORB负责找到对象实现,如果需要则透明的激活它,然后把该请求递交给该对象,最后返回应答给调用者。实现时,可以把ORB不作为单个成分,但它只能由它的接口来定义。任何ORB实现方式提供的接口都是可以接受的。可以把接口中的操作分为三类:

1. 对于所有的ORB实现都一样的操作

2. 特定类型对象的操作

3. 与对象实现种特定类别有关的操作

不同的ORB有不同的实现方式,但都包括有:IDL 编译器, 仓库(repositories),各种Object Adapters,给client提供各种服务集,具有不同属性的对象实现等。

现在有各种不同的ORB实现。一个client可以同时访问两个由不同ORB实现管理的对象引用(object references)当这两个ORB需要一起工作时,它们能区分出各自的对象引用。Client不需要对此负责。ORB Core是ORB的一个组成部分,它提供对象的基本表示和与请求的通信。

有四种不同类型的ORB:

1.Client- and Implementation-resident ORB

2.Server-based ORB

3.System-based ORB

4.Library-based ORB

2.2.4 ORB Interface:
一个ORB是一个逻辑实体(logical entity),它可以用各种方法实现(如一个或多个过程,或一个libraries集合)。为了减轻编写程序的困难,CORBA规范定义了一个抽象的接口。该接口提供各种帮助函数。

2.2.5 CORBA IDL stubs and skeletons:
它相当于client、server应用程序和ORB之间的“胶水”。由CORBA IDL编译器自动实现CORBA IDL定义与目标编程语言之间的转换。

使用编译器可以减少client stub和server skeletons之间的潜在矛盾。

2.2.6 Dynamic Invocation Interface(DII):
该接口允许client直接调用ORB所提供得最底层的请求机制。应用程序使用DII动态地把请求传给对象而不需要IDL接口(包括特定stub)。与IDL stub(它只允许RPC模式的请求)不同,DII也允许clients使用无块的延迟同步调用(non-blocking deferred synchronous)(发送操作是独立的)和单向调用(send-only)。

2.2.7 Dynamic Skeleton Interface(DSI):
与client端的DII类似的,位于server端的接口。DSI允许ORB把请求发送给对象实现,该对象实现不包含编译时所需要的类型。发出请求的client不知道该实现是使用指定类型的IDL skeletons 还是使用动态的skeletons。

2.2.8 Object Adapter:
它帮助ORB把请求传给对象并激活该对象。更重要的是一个object adapter总是与一个对象实现(object implementations)联系的。Object adapter可以被定义来支持特定的对象实现类型(如OODB object adapters用于持续对象(persistence)而library object adapters 用于非远程对象)。


图2-8 典型的Object Adapter结构

它的作用有:

(1)产生和解释对象引用
(2)Method调用
(3)相互作用的安全性
(4)对象和激活实现及撤销实现
(5)把对象引用映射到相应的对象实现
(6)注册对象实现

2.3 系统集成


图2-9 不同对象系统集成的方法

2.4 互操作

ORB 的互操作性提供了种易于理解的、方便的途径来支持网络中的对象,这些对象由多样的,不同种类的(与CORBA 兼容的)ORB管理。由于CORBA中的元素能以很多方式结合在一起以满足各种不同的需要,因此取得“interORBability”的方法很方便。

2.4.1 支持互操作的元素

能支持互操作的元素有::
1. ORB 互操作结构
2. Inter-ORB 桥支持(bridge support)
3. General and Internet inter-ORB Protocols (GIOPs and IIOPs)
而且,该结构还支持environment-specific inter-ORB protocols (ESIOP),它能优化特定领域如DCE)

2.4.2 ORB 互操作结构

该结构引入了ORB域中immediate and mediated bridging(直接桥接和间接桥接)这两个概念。IIOP是广域网桥接的基础。而inter-ORB 桥接既能用于直接桥接,也能用于“半桥接”,使用半桥接能搭建用于间接桥接。使用这些桥接技术,ORB能互操作,而不需要知道彼此的实现细节,如,使用何种特殊的IPC或协议(如ESIOP)来实现CORBA规范。

使用能用IIOP通讯的“半桥接”, 两个或多个ORB能相互桥接在一起。这种方法既能用于单机ORB,也能用于网络ORB如ESIOP。IIOP也能用于实现ORB中的内部消息机制。

2.4.3 Inter-ORB Bridge Support

互操作结构明确指出ORB中不同域的作用,这些域包括对象引用域(object reference domain),类型域(type domain),安全域(safety domain)(如the scope of a Principal identifier), 事物域(transaction domain)等等。

当两个ORB位于同一个域中,它们能直接通讯,多数情况下,这是一个很好的方法。但由于各个机构需要建造各自控制域,因此,这种方法不常使用。当需要的信息离开它的域时,就必须使用桥接来传递信息。桥接的作用是确保信息能完整的从一个ORB映射到另一个ORB。inter-ORB 桥接支持也能提供与非CORBA系统(如Microsoft’s Component Object Model (COM))之间的互操作。

2.4.4 General Inter-ORB Protocol (GIOP)

General Inter-ORB Protocol (GIOP) 元件提供了一个标准传输语法(低层数据表示方法)和ORB之间通信的信息格式集。GIOP只能用在ORB与ORB之间,而且,只能在符合理想条件的面向连接传输协议中使用。它不需要使用更高一层的RPC机制。这个协议是简单的(尽可能简单,但不是简单化),可升级的,使用方便。它被设计为可移动的、高效能的表现、较少依靠其它的低层传输协议。当然,由于不同传输使用不同版本的GIOP,它们可能不能直接协作工作,但它能很容易的连接网络域。

2.4.5 Internet Inter-ORB Protocol (IIOP)

Internet Inter-ORB Protocol (IIOP) 元件指出如何通过TCP/IP连接交换GIOP信息。IIOP为Internet提供了一个标准的协作工作协议,它使兼容的ORB能基于现在流行的协议和产品进行“out of the box”方式的协作工作。它也能被用于两个半桥(half-bridges )之间的协议。该协议能用于任何ORB与IP(Internet Protocol)域之间的协作工作,除非ORB选择了特殊的协议。这时,它是TCP/IP环境下基本的inter-ORB 协议,最普遍的传输层。

IIOP与GIOP的关系就象特特殊语言与OMG IDL之间的关系;GIOP能被映射到不同层,它能指定协议。就象IDL不能见招完整的程序一样,GIOP 本身也不能提供完整的协作工作。IIOP和不同传输层上的其它相似映射,实现抽象的GIOP定义,如图2-10所示。


图 2-10 Inter-ORB Protocol 关系

2.4.6 Environment-Specific Inter-ORB Protocols (ESIOPs)

它为使用Environment-Specific Inter-ORB Protocols (ESIOPs)的条件提出了解决方案。Such protocols would be used for “out of the box” interoperation at user sites where a particular networking or distributing computing infrastructure is already in general use. Because of the opportunity to leverage and build on facilities provided by the specific environment, ESIOPs might support specialized capabilities such as those relating to security and administration. While ESIOPs may be optimized for particular environments, all ESIOP specifications will be expected to conform to the general ORB interoperability architecture conventions to enable easy bridging. The inter-ORB bridge support enables bridges to be built between ORB domains that use the IIOP and ORB domains that use a particular ESIOP.

2.4.7 Domain(域)

域把一个系统中的元素按照某种特征分成几个部分。在本结构中,域是一个范围,一个对象的集合,对象是域的成员,这些成员有共同的特征。可以把域看作是一个对象,它本生也可能是其它域的一个成员。


图2-11 各种类型的域

CORBA中的域分为以下几个部分:

? Referencing domain – 对象引用范围
? Representation domain – 信息传输语法和协议范围
? Network addressing domain –网络地址范围
? Network connectivity domain – 可能的网络信息范围
? Security domain – 特殊安全策略
? Type domain – 特殊标识符范围
? Transaction domain –特定事物服务范围

有两种方式使用域:一是嵌入,一个域包括在另一个域中;二是联合,两个域联合起来使用。当两个域的边界上发生交互作用时,就需要使用一种映射机制(如桥接)在边界处传递相关元素。这里有两种方法,一是间接桥接(mediated bridging),一是直接桥接(immediate bridging)。


图2-12 两种桥接技术, 都用于两个域之间

1.Mediated Bridging

使用间接桥接时,在每一个域的边界上,以一种协商的、通用的格式来传递与域有关的元素。可以从以下几个方面来观察间接桥接:

(1)公共格式的应用范围可能与两个ORB/域的私下约定不同。
(2)可能有多个公共格式,每一种格式对应一个应用目的。
(3)如果有多个可供选择的公共格式,选择方式可以分为两种,一是静态选择(两个ORB开发商之间),二是动态选择(每一个对象各自选择)。
(4)这种方法随着嵌入式编译(与stub相比)或普通的库代码(如加密例程)的不同,它的格式不同

2.Immediate Bridging

使用直接桥接时,在每一个域的边界上,相关的元素直接从一个域的内部格式转到另一个域的内部格式。

可以从以下几个方面来观察间接桥接:

(1)这种方法有被优化的可能性(这时交互不通过第三方)但它是以牺牲灵活性和通用性来取得的。

(2)一般只当需要在与边界传递纯管理(不交换技术)才使用这种方法。例如,当需要在两个相似ORB的安全管理域传递消息时,就不需要使用通用的间接标准。

综上所述,当两个ORB/域使用私有机制时,就比较难于区分这两种方法。

3.Inter-Domain Functionality的位置

从逻辑上讲,不论是间接桥接还是直接桥接,只要是域间桥(inter-domain bridge),它在两个域中都有元素。但是,一方面,域可以跨越ORB边界,而ORB也可以跨越机器和系统边界;另一方面,一个机器或一个进程可能跨越多个ORB。从工程学的角度来讲,这意味着一个域间桥中的元素根据ORB或系统的不同而采取分散或同处的分布方式。例如,如果一个ORB包括两个安全域,那么,域间桥就可以在ORB的内部实现。同样的,也可能在一个进程或系统中实现两个ORB或域间的桥。从工程学来讲,这种情况下,域间桥是有限的,它局限于单个系统或进程。如果所有的桥都用这种方式实现,那么系统或进程之间的协作只能在单个域或ORB中发生。

4.桥接级别(Bridging Level)

桥接可以在ORB级或更高以及实现。它们分别叫做嵌入(in-line)级桥接和请求级(request-level)桥接。请求级桥接使用CORBA API,包括使用Dynamic Skeleton Interface,来接受和流出(issue)请求。但是,也存在“implicit context”类,它与某些引用联合起来,持有如事物信息和安全信息等的ORB Service信息,通常的API中部包括这种类。

5.网络中桥接的结构

在网络情况中的ORB,我们将引入“backbone”ORB的概念。不论是大型网络还是小规模网络倒要用到它。大型网络的制造商可以定义自己的中枢ORB,而小规模网络则选择一个商业的ORB作为它的中枢。


图 2-13 一个ORB作为中枢,它通过半桥和全桥连接其它的ORB

这种中枢结构是一种标准的网络管理技术。它能减少桥接又能满足网络馆管理。对于大型网络来讲,增加ORB桥接并不需要给网络线路增加新的节点(hop)。

2.4.8 桥接的种类

1. In-line Bridging(嵌入桥接)

嵌入桥接的代码位于ORB中,它完成必要的翻译和映射功能。它是两个ORB进行桥接的最直接方法。它与单个ORB中的系统进行侨界的结构相似(例如,间接使用某些内部处理通讯模式,如网络协议)。这表明,实现嵌入桥接可能会修改ORB中的某些基本的元素,例如插入新的内部处理通讯模式。(有一些ORB被设计成可以进行某些修改)。使用这种方法时,在不同级别上用软件元素的集成来完成所需要的桥接功能:

(1)面的ORB提供附加的或可选择的服务
(2)附加的或可选择的stub和skeleton代码


图2-14 使用ORB内部的API构造 In-Line bridges

2. Request-Level Bridging(请求级桥接)

请求级桥接的代码位于ORB的外面,它完成必要的翻译和映射功能。它通过位于不同执行环境中两个ORB的元素(一个ORB一个元素)使用普通协议(如网络、共享内存和主机操作系统提供的其他IPC)来达到目的,这种方法也叫做“半桥”。

请求级桥接的基本原理:

(1)原始请求被传给client ORB 中的代理对象(proxy object)。
(2)代理对象把请求内容(包括目标对象引用)翻译成服务ORB(server ORB)能理解的格式
(3)代理引用透明服务对象上所需要的操作
(4)使用补充路径把操作结果返回给客户A


图2-15 使用公共的ORB API构造 Request-Level bridges

CORBA Core定义了如下接口,使用它们能构造请求级桥接:

(1)Dynamic Invocation Interface (DII) 允许桥接能任意调用对象引用,而当建立桥接时不需要知道对象引用的类型。
(2)Dynamic Skeleton Interface (DSI) 即使当建立桥接时不知道对象引用的类型,也允许桥接手动地调用代理对象引用。
(3Interface Repositories 桥接用来获取信息以驱动DII和DSI,这些信息包括操作参数的类型及返回值和意外。
(4)Object Adapters (例如Basic Object Adapter) 当引导桥接和映射对象引用(从一个ORB动态地传给另一个ORB)时,创建对象引用的代理器。
(5)CORBA Object References 提供操作,这些操作能完全描述它们接口和建造把对象引用映射到它们代理器(或反之)的表。Interface repositories 虽然半桥接使用的给定的池ID(如接口类型ID,意外ID)或操作ID必须一致,但是与半桥接相连的两边的接口池(Interface repositories )中的信息可以不一样。