1.3 CORBA分布式面向对象体系结构
公共对象请求代理结构(CORBA)是一个被软件工业界广泛认同和采纳的、用来开发分布式面向对象应用软件的体系结构,同时也是由OMG(国际对象管理组)制订的软件互操作国际标准,其目的就是提供一个分布式应用程序开发的公共框架,使得在分布于计算机网络中的各种异构平台上(硬件或操作系统都不尽相同)实现的软件都可以互连、互通和互操作。
1.3.1 CORBA运行时架构
CORBA以ORB(对象请求代理)作为软件之间在底层交换信息的通道,不同的厂家都可以开发特定平台下的ORB产品和CORBA公共服务,只要都遵循CORBA标准,就可以相互传递软件信息。基于CORBA开发的应用系统的运行时架构如下图所示:
图1-4 CORBA运行时架构
设计CORBA的初衷正是面向客户机/服务器应用程序开发,目的就是屏蔽客户机和服务器所在主机的操作系统和底层通信协议的细节和差异,向应用层开发提供基于公共接口(Interface)的面向对象实现手段,不论服务器程序和客户机程序位于同一个进程内、同一台主机的不同进程中还是用网络连接起来的不同主机上,它都能提供这种位置透明性、网络协议无关性和平台无关性,使得访问远程对象就像访问同一个进程地址空间内的本地对象一样简单和容易。
CORBA在接口调用或对象调用的层面上来看待客户机和服务器之间的“请求-服务-应答”过程,而不是在网络协议和网络消息的层面上。公共接口成为客户程序和CORBA对象之间的交互协议,每一个服务对应公共接口的一个方法,每个CORBA对象可以实现一个或多个接口。客户机通过调用公共接口定义的操作就可以定位并访问到驻留在远端服务器进程中的CORBA对象实现。每一个提供服务的CORBA对象可以看作是一个单独的服务器,而每一个发起调用请求的对象也可以看作是一个单独的客户机。所以客户机程序中也可以实现CORBA对象来提供服务,而服务器程序也可以向其他CORBA对象发起调用请求。客户机和服务器的角色定位已经不再是绝对的了,而完全转化为对象与对象之间的调用关系,且对象位于本地还是远端其调用方式都是一样的,这大大方便和简化了大规模分布式应用系统的构建。当然,对象之间的每一个调用操作都将被ORB翻译为客户程序和服务器程序之间的一条或多条网络消息。
CORBA ORB是分布式面向对象系统中对象之间发送和接收消息的软件总线,也是建立在操作系统和网络通信协议之上的应用程序交互中间件。为了在多个厂家开发的ORB产品之间实现互联、互通和互操作,OMG开发了GIOP协议即通用ORB间协议,它提出了在各种异构环境中用于解决本地硬件体系结构之间差异的公共数据表示方法和ORB间消息传递的格式。IIOP协议即Internet ORB间协议则是GIOP协议在Internet环境下的一个实现,它直接建立在TCP/IP协议之上。
1.3.2 CORBA应用系统开发模式
在使用CORBA进行C/S应用系统开发前,我们首先将应用层业务需求映射为语言无关的公共IDL接口定义,然后分别用服务器端和客户端各自的IDL编译器编译这些接口,生成服务器端的骨架码和客户端的存根码(或称为码根)。开发人员接着在骨架码和码根的基础上分别编写服务器端业务逻辑实现(即CORBA对象的实现)和客户端源码(必要时调用服务器上的CORBA对象实现),最后把所有源码编译并与ORB链接库链接,生成服务器端和客户端的可执行程序。这个过程可用下图表示:
图1-5 CORBA应用开发过程示意
1.3.3 CORBA对象调用过程
每一个IDL接口或其子接口最终都要由具体的类来实现,这些实现类实例化后就成为一个个的CORBA对象,每一个CORBA对象也都是一个服务器对象。客户程序在调用任何一个CORBA对象的服务前必须先获得该对象的引用(IOR,互操作对象引用),然后从该引用创建一个位于客户程序地址空间内的代理对象(它代表该远程CORBA对象),而该CORBA对象的实现是位于本机还是远端服务器上已经不重要了。此后客户程序对代理对象的调用被ORB转换为代理对象与CORBA对象之间的交互。客户程序调用CORBA对象X的过程如下图所示:
图1-6 CORBA对象创建和调用示意
要获得CORBA对象的引用,一般有如下几种方法:
(1)客户端以CORBA服务对象的唯一名称作为参数调用一个bind()方法;
(2)使用一个总所周知的CORBA命名服务(Naming Service),所有客户端和服务器都知道这个服务所在的位置,并且CORBA对象实现在启动时首先向命名服务器注册自己,该服务就会把CORBA对象的唯一名称映射为对应的IOR;
(3)通过其他途径获得一个CORBA对象的IOR,比如email或者专用的Socket连接;
(4)初始CORBA对象的引用可以用以上方法中的任意一种得到,而其他CORBA对象的引用则可以通过调用初始CORBA对象的一些接口操作得到,当然这样做的前提是在定义IDL接口时就考虑到这种需求并已做好了规划和设计。
1.3.4 CORBA的特点
CORBA的优点是很明显的。首先,它是软件互连和互操作的一个国际标准;其次使用各种语言实现的ORB作为一种面向对象的软件通信中间件,可以使各种异构平台上用不同语言开发的应用程序之间实现无缝通信和互操作,即能够同时做到语言无关、编译器无关、硬件平台无关和操作系统无关,这是其他分布式中间件做不到的。这至少带来了以下好处:
- 开发人员不再需要关心使用什么网络协议来通信,也不需要关心服务器在网络中的位置,更不需要关心服务器是用什么语言开发的,他们只需关心接口如何定义,需要传递什么数据,以及服务器和客户端的业务逻辑如何实现即可,这大大减轻了开发负担;
- 它让开发人员选择最适当的操作系统、运行环境和自己最擅长的编程语言来建设系统的各个组成部分,然后让它们互联互通;
- 它允许集成已有的软件和组件,这些组件可以拿来实现CORBA对象的业务逻辑,这样就能让原有系统继续发挥余热,避免重复建设,保护了用户的投资;
- 提供服务的CORBA对象可以在网络中动态迁移,以根据需要均衡负载,而客户端应用程序不需要做任何改变(当然,CORBA对象的IOR会变化,客户端只需重新获取即可);
- 使用符合标准的中间件产品作为基础应用程序解决方案,可以大大节省应用软件的开发成本,同时可缩短开发周期,降低开发风险;
- 使用标准的中间件产品,对技术的发展和变化可以放心,因为它们都由专业的公司负责维护和升级,他们会把握技术方向和进行技术革新。
CORBA标准的特点是内容很全面,可用的公共服务和设施比较多,互操作性和开放性都非常好,但是它的缺点就是庞大而复杂。CORBA标准虽然好,但是理想终归是理想,很难全部变成现实。由于它太复杂,所以尽管有多家供应商提供商业化CORBA产品,但是没有一家能够独立为异构网络中的所有环境提供所有实现,不同的ORB之间经常会出现无法互操作的情况。另外,CORBA也允许实现厂商自定义某些扩展(像C++一样具有不确定性),特别是CORBA在多线程并发编程方面缺乏规范,所以使用C++这种存在多种实现版本的语言开发的CORBA应用程序,其源码兼容性很难保证(虽然是使用C++语言,但是最终你还得使用其中一个实现,不管是GCC、VC++还是SunCC)。最后,CORBA接口调用的开销相对来说也比较大,数据传输效率低(特别不适合于传输大数据量的数据),所以在要求实时响应的应用领域不能胜任,不过现在的实时CORBA可以弥补这一不足。
CORBA过于复杂,要熟练使用 CORBA除了需要具备一定的面向对象思维和程序设计功底,同时接受CORBA强加的一系列抽象概念外(无异于一次洗脑J),还要熟练运用某一个特定产品及其工具,开发者通常需要经历长期的学习和积累,即使有专门的培训也不见得短期内就能够掌握;如果想成为这方面的专家,那没有好几年的修炼是做不到的。不过,现在也有一些简单易用的开源ORB实现可以使用,如MICO、omniORB、ACE TAO以及JacORB等,相对来说它们要比专业公司开发的产品容易上手,读者不妨一试。