微型机与应用
MICROCOMPUTER & ITS APPLICATIONS
1999年 第18卷 第2期 Vol.18 No.2 1999



分布式WEB组件模型分析
张　钧　姜永炅　侯文永
　　摘　要：分析了组件模型的规范和CORBA、DCOM两种工业标准的组件模型，探讨了组件模型的体系结构和分布式计算等问题。
　　关键词：组件　分布式计算　三层体系结构　ActiveX/DCOM模型　JavaBeans/CORBA模型
　　进入90年代以来，组件方法已成为工业界普遍接受的提高软件质量、可靠性与软件生产力的行之有效的方法和技术。组件方法是指用装配可重用软件组件的方法来构造应用程序。软件组件又称为软件构件，是具有特殊计算功能的、自主的软件模块，这种软件模块遵照一定的接口规范可以实现互操作。与对象相比，组件是自主的，软件组件化不需要代码的重新编译和联接，而直接作为功能模块在二进制级用于软件系统的装配。软件组件化思想和代码重用优势以及组件用于WEB应用所形成的Object WEB、three-tier体系和分布式处理，给软件工程带来了新的活力。
1　组件模型
1.1　组件模型的共性
　　组件模型为开发者定义软件组件建立了一套体系结构和API集，它主要由组件(Component)和容器(Container)构成。组件是软件的具有可重用特性的基本部件，容器类似于装配车间，是一种存放相关组件的“器皿”，用于安排组件、实现组件间的交互，其形式可以是表格、页面、框架和外壳，同时容器可以作为另一个容器的组件。
　　一般组件模型提供以下6种服务：
　　1.组件接口暴露与显示。在组件模型中，为实现组件之间以及组件与容器之间的交互，组件就必须将自身的接口公开。因此，不论组件是使用何种工具构建的，都可以通过该机制实现组件间的动态交互。
　　2.组件特性。指1个组件的公共属性，或者直接反映组件的状态，或者直接影响组件的状态，可以通过方法调用来获取或修改这些属性。
　　3.事件处理。事件处理机制的作用是激活事件、广播事件，将事件传递给相应的组件。
　　4.持久性。持久性是将组件的状态存储在一个较稳定的地方，如容器的相关描述中和其它组件的相互关系描述中，有利于快速及正确地保存和访问这些状态。
　　5.应用构造器支持。是组件向应用开发工具显示自身属性和行为的机制，利用此接口，开发工具可以决定组件的属性和行为，修改组件的状态和外观，建立组件间的联系。
　　6.组件打包。是指将分布在网络各处的资源“打包”成1个组件的机制，该组件仅有1个入口。
1.2　ActiveX/DCOM模型
　　在ActiveX/DCOM模型中，COM是DCOM的基础，由1组规范和1个系统级实现构成，这组规范包括COM核心、结构化存储、统一数据传输以及智能命令。其中COM核心定义了软件组件的对象与其使用者如何通过二进制接口标准进行交互的规格说明；结构化存储定义了符合文档的存储格式，以及创建文档的接口；统一数据传输定义了一套组件间数据交换的标准接口；智能命名给对象1个系统可识别的名字。
　　COM采用COM IDL描述组件接口，支持多接口可用于解决版本问题，COM定义了1个所有组件都支持的特殊接口IUnknown，其它接口都可以从这个接口继承；COM采用OSF DCE定义通用单值标识符(UUID)类似的方法定义全局唯一标识符(GUID)，它是1个128位整数，生成GUID的算法保证了标识的唯一性；COM还有1个关键部分――注册数据库，每个存在于给定系统的组件服务器都在注册数据库中注册，数据库存储了组件服务器的标识以及服务器类型和路径。
　　在COM模型中，有2类服务器，即进程内服务器和进程外服务器。进程内服务器是本地机上的DLL，进程外服务器可以是本地EXE可执行程序或远程机的DLL和EXE。1个服务器内部包括2部分，即组件的实现体和类工厂。类工厂的功能是生产组件对象。并把对象的接口指针返回给客户。
　　COM库在操作系统内完成查找注册数据库、定位组件服务器以及返回对象指针的工作。客户收到接口指针时，COM自动退出，由客户和服务器直接通信。COM可让客户透明地和组件进行通信，而不必考虑其具体位置。这种透明性由服务控制机制SCM完成，如果组件位于进程内，则可直接调用，当组件位于进程外时，调用先到达SCM提供的Proxy，再由Proxy生成服务对象的PRC来实现。

图1  COM工作机制
　　DCOM是对COM网络技术的改进，把组件软件应用推向了Internet，它支持多种通信协议，为Java提供分布能力，支持多种开发语言，其底层实现仍然基于DCE RPC。
　　ActiveX建立在DCOM模型上，它包括控制、文档、脚本3种最常用的技术，同时也包括Java虚拟机和服务器框架。它缩小了组件尺寸以便加快组件下载的速度，置于WEB页面中，用于开发基于WEB的应用系统(包括数据库应用)。
1.3　JavaBeans/CORBA模型
　　CORBA，OMG的公共对象请求代理体系结构，定义了如何在网络上通过ORB进行互操作，CORBA不仅是1种对象请求的中介工具，也是1个分布式对象平台。纯CORBA可以支持任何语言和操作系统的访问。
　　CORBA通过将自己的对象模型映射到客户和服务器所用语言的具体对象模型，实现接口定义和服务实现的对应关系。这一独立的组件模型体现在IDL上，IDL语言描述服务边界及接口，根据该接口定义，客户程序就可以提出服务请求。ORB负责为对象请求寻找能提供相应服务的对象，从而提供了应用系统实现的分布能力。
　　JavaBeans是Sun公司提出的基于Java的组件模型，采用纯Java编写、独立于平台，Bean可以是可视化组件，也可以是实现一些基础性工作的非可视对象。JavaBeans在本地的活动是在与其容器相同的地址空间内进行的；在网络范围内，JavaBeans原先主要采用Java RMI(Java Remote Method Invocation)进行组件间通信，应用的客户端和服务器都是参照分布式系统接口实现的，而分布式系统接口能被自动地、透明地从客户端传送到服务器端。
　　CORBA和Java的结合使JavaBeans组件间的通信以CORBA/IIOP作为基础设施，Java ORB完全采用Java编写，所有的系统接口都是采用Java IDL定义的，Java Stub可以由IDL接口产生。通过JDK这样的包含Java ORB的组件开发环境，JavaBeans使用Java IDL规范定义组件的接口，这使得JavaBeans能够通过IIOP与IDL服务器相互调用。
　　下面是在基于WEB计算的体系结构中，JavaBeans/CORBA组件模型的工作机制。
　　1.从WEB服务器下载HTML页面，包括内嵌的Java小程序的索引。
　　2.浏览器从HTTP服务器检索Java组件，HTTP服务器在找到所需的索引后，以字节码的形式下载给浏览器。
　　3.浏览器加载组件，首先要经过Java运行安全检查，然后进入客户机内存。
　　4.Java组件中按照IDL生成的客户机程序段遵循IIOP调用ORB服务器中的对象，这种对话将一直持续下去，直到其中一方申请终止。
　　5.服务器对象也可以为客户机生成下1个HTML页面，告诉客户机下面该从哪儿下载什么URL。在基于WEB数据库的应用中，服务器JavaBeans组件往往通过JDBC访问SQL数据库，这些数据库可以放在远程数据库服务器上。与HTTP/CGI不同，用户可以通过CORBA嵌入在HTML页面的任何组件与服务器通信，而不必从页面内容中调出。
　　图2为CORBA组件模型的工作机制示意图。

图2  CORBA组件模型工作机制
2　分布式计算
　　在分布式计算模型中，需要涉及到许多地理分布的资源，参与的计算任务在事务失败的情况下往往会发生数据不一致情况，因此提供服务的健壮性、可靠性及服务质量就非常重要。
　　与传统大型机运算相似，在基于服务的网络环境中，分布式计算也需要TP monitor的协调，TP monitor管理所有参与运算的进程，对客户端提供消息传送、负载平衡和故障恢复，并保持整个任务是1个原子事务。对消息传送来说，通常需要消息队列中间件来保证它在网络环境中的正确性和无重复。这种中间件按照同步、异步或存储转发3种机制在不同的操作系统中按不同的通信情况连接，在连接失败时，队列中的消息将在连接恢复时重新发送。对于比大型机环境更为复杂的连接，往往需要多个TP monitor和消息中间件来提供服务。
　　此外，参与分布式计算的服务组件和资源在网络中是分布存在的，由组件协调器提供负载均衡的能力。客户浏览器中的组件发出了对象请求，通过代理，在网络中搜寻并定位服务对象(组件)的位置，并使之提供所需的服务。
　　在DCOM模型中，MTS担任了事务监控和组件协调的角色。要使ActiveX组件事务化，只需在应用程序中将其Transaction Required属性置为真，在事务处理中调用SetComplete或SetAbort例程让MTS提交或回滚1个事务。通过MTS，服务器端组件注册到WEB服务器后，可以动态地分布到网络的站点上运行，透明地为申请服务的组件完成数据访问、计算或其它任务，提高此类WEB应用系统的网络运行效率。相应地，在CORBA/ORB模型中，JavaBeans组件的分布和通信由Java ORB通过IIOP协议进行，而事务管理则需要像IBM Component Broker或BEA Tuxedo/Iceberg这样的TP monitor来完成。
3　WEB组件模型的体系结构
　　Intranet的发展使得WEB成为取代传统C/S体系的应用系统开发手段，它在传统2层C/S模型中加入新的1层――WEB组件服务，从而形成three-tier体系结构。
　　在客户端，浏览器从WEB服务器下载HTML页面，作为应用程序与用户交互的接口，页面中的客户机组件可以和其它客户机组件或服务器组件通信。
　　服务器端组件通过IDL封装起来，作为中间层在WEB端运行，把应用程序的表示逻辑与事务逻辑、应用逻辑分开，提供数据计算、数据库访问等服务。如在CORBA模型中，JavaBeans组件通过JDBC访问数据库，通过Java ORB相互通信，IIOP充当了通用数据总线的角色。TP monitor也同样包含在中间层中，保证由众多组件参与运算的事务的数据完整性。
　　在后端，所有组件能够访问的空间组成了第3层，如数据库系统、邮件系统和群件服务器等。与传统2层C/S结构不同的是，这些服务没有直接面向客户端服务，而是由服务器组件完成，为客户端返回执行的结果。
　　ActiveX/DCOM和JavaBeans/CORBA――这2种组件模型使基于WEB的three-tier体系方法真正成熟，它们不但解决了WEB数据库应用效率的问题，同时组件方法和软件组件化技术使应用系统的事务逻辑、应用逻辑和表示逻辑可以分层实现和层内组件化；three-tier体系在Intranet上的构建可以通过代码重用技术充分利用业务无关的软件组件来构建新的系统，提高软件生产率。
　　组件思想自VB中的控件、Delphi的特色数据库访问组件以来逐渐在客户端程序开发中变得成熟，同时在基于WEB数据库的应用中，也从CGI、服务器API而最终采用了组件模型。尽管目前ActiveX/DCOM和JavaBeans/CORBA之间存在着标准之争，但组件方法是大势所趋，组件模型将是软件开发、构造应用系统的最为行之有效的方法。
作者单位：上海交通大学计算机科学与工程系(200030)
参考文献
1　Pountain D.The Component Enterprise.Byte,1997;(5)
2　Pountain D,Montgomery J.Web Components.Byte,1997;(8)
3　Chappell D,Lintbicum D S.ActiveX Demystified.Byte,1997;(9)
4　Montgomery J.Distributing Components.Byte,1997;(4)
5　Pompeii J.Programming with CORBA and DCOM.Byte.1997;(4)
6　麦中凡.从OLE到DCOM――微软的构件软件技术分析.中国计算机用户，1997；(5)
(收稿日期：1998-08-15)
