公用对象请求代理(调度)程序体系结构(Common Object Request Broker Architecture),缩写为 CORBA,是对象管理组织(Object Management Group)对应当今快速增长的软硬件的协同工作能力的要求而提出的方案。
CORBA 定义对象之间交互的协议, 允许应用程序和其他的应用程序通讯;这些对象可以用不同的编程语言写成,运行在不同的操作系统上,存在于不同的机器上。CORBA 1.1 由对象管理组织在 1991 年发布。他定义了接口定义语言(IDL)和应用编程接口(API),从而通过实现对象请求代理(ORB)来激活客户/服务器的交互。CORBA 2.0 于 1994 年的 12 月发布。他定义了如何跨越不同的 ORB 提供者而进行通讯。
ORB是一个中间件(middleware),它可以建立对象之间的client/server关系。通过ORB,一个client可以透明的引用同一台机器上或网络上的一个server对象的方法。ORB 截获调用然后负责找到一个对象实现这个请求,传递参数和方法,最后返回结果。client并不清楚该对象的位置,它的编程语言,它的操作系统以及其它不是对象接口的系统信息。 ORB能实现分布环境中位于不同机器上的应用之间的互操作以及多对象系统之间的无缝连接。
在传统的(client/server)应用中,开发者使用自己设计的标准或通用标准来定义设备之间的协议。协议定义与实现的语言、网络传输及其它有关因素。ORB简化了这一过程,它使用IDL来定义应用接口之间的协议。ORB允许程序员选择通用操作系统,运行环境和编程语言。更重要的是,他允许集成现存组件。
CORBA 是在面向对象标准化和互操作性道路上的一个信号。通过 CORBA,用户不必要知道软硬件的平台和他们处在企业网的什么地方就可以操作。
ORB 特定于 CORBA 实现(ORBit 有它自己的 ORB),但来在不同厂商的 ORB 之间可以透明的通信,这有赖于公共的协议。这意味着你可以使用某个 ORB 并用它建立对象,这之后你决定这个 ORB 不再使用(sucks) (比如说它太慢了),你可以使用其他的 ORB 并有同样的对象交互。
下面的示意图解释这种机制:
图 1. ORB 通信
当你做到对象的调用时,你必须生成正确的消息:stub 就是用来做这个的。skeleton 负责把这些消息转换成正确的到对象的调用。编程者负责写 stub 和 skeleton,不过有一些工具可以帮助你,我们将在后面看到它。stub 担当本地的代表或远程对象的代理(proxy),这样就能与远程对象一起工作、就象它在本地一样。skeleton 做严格的相反的事。COM 编程者要注意:CORBA stub 在 COM-lingo 中叫做 proxy,而skeleton 大致扮演 COM stub 同样的角色。
这就是基本的 CORBA 体系,但 CORBA 有更多的内容:CORBA 的目标是个创建一个分布式系统。ORB 是对象用的框架(framework),而 CORBA 还定义了一系列丰富的对象和伪对象(pseudo-object)(ORB 提供的同对象一样的外表)来处理编程者在与分布式对象一起工作时所面对的各种要点。
ORB 结构
下面我来用些图形说明一下:
通过 ORB 发送请求
上面的图形说明的是客户端发送一个请求到对象的实现。客户端是希望对某对象执行操作的实体。对象的实现是一片代码和数据来实际实现对象。ORB 负责下面的必要的机制:对该请求找到对象的实现,让对象的实现准备好接受请求,和请求交换数据。客户端的接口完全独立于对象的位置,其实现的语言和其他不影响对象接口的东西。
ORB 接口的结构
上面的图形显示的是一个独立的对象请求代理(ORB)的结构。ORB 的接口是灰色的矩形。箭头说明 ORB 的调用关系。
为了提出一个请求,客户端可以使用动态调用接口(Dynamic Invocation Interface)(和目标对象的接口独立)或者一个 OMG 的 IDL 占位程序(具体的占位程序依赖于目标对象的接口)。客户端也可以直接和 ORB 在某些地方交互。
对象的实现通过 OMG 的 IDL 产生的骨架或者是一个动态骨架的调用来接受请求。对象的实现可能在处理请求或其他的时候调用 ORB。
对象接口定义的定义可以有下面两种方式。接口可以通过接口定义语言静态的定义,这叫做 OMG 的 IDL。该语言按照可以进行的操作和该操作的参数定义对象类型。或者(也可以作为补充),接口可以加入到 Interface Repository service。该服务描述了该接口作为一个对象的组件,并允许运行时访问这些组件。在任何 ORB 实现中,IDL 和 Interface Repository 有相同的表达能力。
客户端使用占位程序或者动态调用接口
客户端通过访问对象的对象引用和了解对象的类型及要求执行的操作来发布一个请求。客户调用占位程序例程来请求或者动态构造请求。
无论动态还是占位程序的接口都可以相同实现。接收方不可能知道请求是如何发布的。
对象的实现接受请求ORB 向对象实现定位适当的代码,传递参数,传输控制。这一切都通过 IDL 骨架或者动态骨架。骨架对于不同的接口和对象适配器是不同的。在执行该请求的时候,对象的实现可能由 ORB 通过对象适配器来获得一定的服务。当请求完成,控制和输出值返回给客户。
对象的实现可能会选择使用的对象适配器。该决定基于对象的实现要求的服务。
接口和 Implementation Repositories
上图说明的是接口和实现信息如何让客户和对象实现访问的。接口用 OMG 的 IDL 和/或 Interface Repository 定义。该定义用于产生客户占位程序和对象的实现的骨架。
对象的实现的信息在安装时就提供好了,储存在 Implementation Repository 中以便请求发布的时候使用。