8.4.5 基于对象的中间件

现在让我们考察第三种范型。这里不再说一切都是文档或者一切都是文件,取而代之,我们会说一切都是对象。对象是变量的集合,这些变量与一套称为方法的访问过程绑定在一起。进程不允许直接访问这些变量。相反,要求它们调用方法。

有一些程序设计语言,如C++和Java,是面向对象的,但这些对象是语言级的对象,而不是运行时刻的对象。一个知名的基于运行时对象的系统是CORBA(公共对象请求代理体系结构,Common Object Request Broker Architecture)(Vinoski,1997)。CORBA是一个客户机-服务器系统,其中在客户机上的客户进程可以调用位于(可能是远程)服务器上的对象操作。CORBA是为运行不同硬件平台和操作系统的异构系统而设计的,并且用各种语言编写。为了使在一个平台上的客户有可能使用在不同平台上的服务器,将ORB(对象请求代理,Object Request Broker)插入到客户机和服务器之间,从而使它们相互匹配。ORB在CORBA中扮演着重要的角色,以至于连该系统也采用了这个名称。

每个CORBA对象是由叫做IDL(接口定义语言,Interface Definition Language)的语言中的接口定义所定义的,说明该对象提供什么方法,以及每个方法期望使用什么类型的参数。可以把IDL的规约(specification)编译进客户端桩过程中,并且存储在一个库里。如果一个客户机进程预先知道它需要访问某个对象,这个进程则与该对象的客户端桩代码链接。也可以把IDL规约编译进服务器一方的一个框架(skeleton)过程中。如果不能提前知道进程需要使用哪一个CORBA对象,进行动态调用也是可能的,但是有关动态调用如何工作的原理则不在本书的讲述范围内。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

当创建一个CORBA对象时,一个对它的引用也创建出来并返回给创建它的进程。该引用涉及进程如何标识该对象以便随后对其方法进行调用。该引用还可以传递给其他的进程或存储在一个对象目录中。

要调用一个对象中的方法,客户机进程必须首先获得对该对象的引用。引用可以直接来源于创建进程,或更有可能是,通过名字寻找或通过功能在某类目录中寻找。一旦有了该对象的引用,客户机进程将把方法调用的参数编排进一个便利的结构中,然后与客户机ORB联系。接着,客户机ORB向服务器ORB发送一条消息,后者真正调用对象中的方法。整个机制类似于RPC。

ORB的功能是将客户机和服务器代码中的所有低层次的分布和通信细节都隐藏起来。特别地,客户机的ORB隐藏了服务器的位置、服务器是二进制代码还是脚本、服务器在什么硬件和操作系统上运行、有关对象当前是否是活动的以及两个ORB是如何通信的(例如,TCP/IP、RPC、共享内存等)。

在第一版CORBA中,没有规定客户机ORB和服务器ORB之间的协议。结果导致每一个ORB的销售商都使用不同的协议,其中的任何两个协议之间都不能彼此通信。在2.0版中,规定了协议。对于用在Internet上的通信,协议称为IIOP(Internet InterOrb Protocol)。

为了能够在CORBA系统中使用那些不是为CORBA编写的对象,可以为每个对象装备一个对象适配器(object adapter)。对象适配器是一种包装器,它处理诸如登记对象、生成对象引用以及激发一个在被调用时处于未活动状态的对象等琐碎事务。所有这些与CORBA有关部分的布局如图8-39所示。

阅读 ‧ 电子书库
图 8-39 基于CORBA的分布式系统中的主要元素(CORBA部件由灰色表示)

对于CORBA而言,一个严重问题是每个CORBA对象只存在一个服务器上,这意味着那些在世界各地客户机上被大量使用的对象,会有很差的性能。在实践中,CORBA只在小规模系统中才能有效工作,比如,在一台计算机、一个局域网或者一个公司中用来连接进程。