第3章 软件体系结构风格 软件体系结构设计的一个核心问题是能否使用重复的体系结构模式,即能否达到体系结构级的软件重用。也就是说,能否在不同的软件系统中,使用同一体系结构。基于这个目的,学者们开始研究和实践软件体系结构的风格和类型问题。 软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式(idiomatic paradigm)。体系结构风格定义了一个系统家族,即一个体系结构定义一个词汇表和一组约束。词汇表中包含一些构件和连接件类型,而这组约束指出系统是如何将这些构件和连接件组合起来的。体系结构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个模块和子系统有效地组织成一个完整的系统。按这种方式理解,软件体系结构风格定义了用于描述系统的术语表和一组指导构建系统的规则。 对软件体系结构风格的研究和实践促进了对设计的重用,一些经过实践证实的解决方案也可以可靠地用于解决新的问题。体系结构风格的不变部分使不同的系统可以共享同一个实现代码。只要系统使用常用的、规范的方法来组织,就可使其他设计师很容易地理解系统的体系结构。例如,如果某人把系统描述为“客户服务器”模式,则不必给出设计细节,相关人员立刻就会明白系统是如何组织和工作的。 3.1经典软件体系结构风格 软件体系结构风格为大粒度的软件重用提供了可能。然而,对于应用体系结构风格来说,由于视点的不同,系统设计师有很大的选择余地。要为系统选择或设计某一个体系结构风格,必须根据特定项目的具体特点,进行分析比较后再确定,体系结构风格的使用几乎完全是特定的。 讨论体系结构风格时要回答的问题如下。 (1) 设计词汇表是什么? (2) 构件和连接件的类型是什么? (3) 可容许的结构模式是什么? (4) 基本的计算模型是什么? (5) 风格的基本不变性是什么? (6) 此风格使用的常见例子是什么? (7) 使用此风格的优缺点是什么? (8) 此风格常见的特例是什么? 这些问题的回答包括体系结构风格的最关键的4要素内容,即提供一个词汇表、定义一套配置规则、定义一套语义解释原则和定义对基于这种风格的系统所进行的分析。Garlan和Shaw根据此框架给出了通用体系结构风格的分类。 (1) 数据流风格: 批处理序列、管道与过滤器。 (2) 调用/返回风格: 主程序与子程序、面向对象风格、层次结构。 (3) 独立构件风格: 进程通信、事件系统。 (4) 虚拟机风格: 解释器、基于规则的系统。 (5) 仓库风格: 数据库系统、超文本系统、黑板系统。 软件体系结构原理、方法与实践(第3版) 第 3 章软件体系结构风格 3.1.1管道与过滤器 在管道与过滤器风格的软件体系结构中,每个构件都有一组输入和输出,构件读输入的数据流,经过内部处理,然后产生输出数据流。这个过程通常通过对输入流的变换及增量计算来完成,所以在输入被完全消费之前,输出便产生了。因此,这里的构件被称为过滤器,这种风格的连接件就像是数据流传输的管道,将一个过滤器的输出传到另一过滤器的输入。此风格特别重要的过滤器必须是独立的实体,它不能与其他的过滤器共享数据,而且过滤器不知道它上游和下游的标识。一个管道与过滤器网络输出的正确性并不依赖于过滤器进行增量计算过程的顺序。 图31是管道与过滤器风格的示意图。一个典型的管道与过滤器体系结构的例子是以UNIX Shell编写的程序。UNIX既提供一种符号,以连接各组成部分(UNIX的进程),又提供某种进程运行时机制以实现管道。另一个著名的例子是传统的编译器。传统的编译器一直被认为是一种管道系统,在该系统中,一个阶段(包括词法分析、语法分析、语义分析和代码生成)的输出是另一个阶段的输入。 图31管道与过滤器风格的体系结构 管道与过滤器风格的软件体系结构具有以下特点。 (1) 使得软构件具有良好的隐蔽性和高内聚、低耦合的特点。 (2) 允许设计师将整个系统的输入/输出行为看成是多个过滤器的行为的简单合成。 (3) 支持软件重用。只要提供适合在两个过滤器之间传送的数据,任何两个过滤器都可被连接起来。 (4) 系统维护和增强系统性能简单。新的过滤器可以添加到现有系统中; 旧的可以被改进的过滤器替换掉。 (5) 允许对一些如吞吐量、死锁等属性的分析。 (6) 支持并行执行。每个过滤器是作为一个单独的任务完成,因此可与其他任务并行执行。 但是,这样的系统也存在着如下不利因素。 (1) 通常导致进程成为批处理的结构。这是因为虽然过滤器可增量式地处理数据,但它们是独立的,所以设计师必须将每个过滤器看成一个完整的从输入到输出的转换。 (2) 不适合处理交互的应用。当需要增量地显示改变时,这个问题尤为严重。 (3) 因为在数据传输上没有通用的标准,每个过滤器都增加了解析和合成数据的工作,这样就导致了系统性能下降,并增加了编写过滤器的复杂性。 3.1.2数据抽象和面向对象系统 抽象数据类型概念对软件系统有着重要作用,目前软件界已普遍转向使用面向对象系统。这种风格建立在数据抽象和面向对象的基础上,数据的表示方法和它们的相应操作封装在一个抽象数据类型或对象中。这种风格的构件是对象,或者说是抽象数据类型的实例。对象是一种被称作管理者的构件,因为它负责保持资源的完整性。对象是通过函数和过程的调用来交互的。 图32是数据抽象和面向对象风格的示意图。 图32数据抽象和面向对象风格的体系结构 面向对象的系统有许多早已为人所知的优点,如下所述。 (1) 因为对象对其他对象隐藏它的标识,所以可以改变一个对象的标识,而不影响其他的对象。 (2) 设计师可将一些数据存取操作的问题分解成一些交互的代理程序的集合。 但是,面向对象的系统也存在着如下问题。 (1) 为了使一个对象和另一个对象通过过程调用等进行交互,必须知道对象的标识。只要一个对象的标识改变了,就必须修改所有其他明确调用它的对象。 (2) 必须修改所有显式调用它的其他对象,并消除由此带来的一些副作用。例如,如果A使用了对象B,C也使用了对象B,那么,C对B的使用所造成的对A的影响可能是料想不到的。 3.1.3基于事件的系统 基于事件的系统风格的思想是: 构件不直接调用一个过程,而是触发或广播一个或多个事件。系统中其他构件中的过程在一个或多个事件中注册,当一个事件被触发,系统自动调用在这个事件中注册的所有过程,这样,一个事件的触发就导致了另一模块中的过程的调用。因此,该风格也称隐式调用。 从体系结构上说,这种风格的构件是一些模块,这些模块既可以是一些过程,又可以是一些事件的集合。过程可以用通用的方式调用,也可以在系统事件中注册一些过程,当发生这些事件时,过程被调用。 基于事件的隐式调用风格的主要特点是: 事件的触发者并不知道哪些构件会被这些事件影响。这样不能假定构件的处理顺序,甚至不知道哪些过程会被调用,因此,许多隐式调用的系统也包含显式调用作为构件交互的补充形式。 支持基于事件的隐式调用的应用系统很多。例如,在编程环境中用于集成各种工具,在数据库管理系统中确保数据的一致性约束,在用户界面系统中管理数据,以及在编辑器中支持语法检查。例如,在某系统中,编辑器和变量监视器可以登记相应Debugger的断点事件。当Debugger在断点处停下时,它声明该事件,由系统自动调用处理程序,如编辑程序可以卷屏到断点,变量监视器刷新变量数值。而Debugger本身只声明事件,并不关心哪些过程会启动,也不关心这些过程做什么处理。 隐式调用系统的主要优点如下。 (1) 为软件重用提供了强大的支持。当需要将一个构件加入现存系统中时,只需要将它注册到系统的事件中。 (2) 为改进系统带来了方便。当用一个构件代替另一个构件时,不会影响其他构件的接口。 隐式调用系统的主要缺点如下。 (1) 构件放弃了对系统计算的控制。一个构件触发一个事件时,不能确定其他构件是否会响应它。而且即使它知道事件注册了哪些构件的过程,它也不能保证这些过程被调用的顺序。 (2) 数据交换的问题。有时数据可被一个事件传递,但另一些情况下,基于事件的系统必须依靠一个共享的仓库进行交互。在这些情况下,全局性能和资源管理便成了问题。 (3) 既然过程的语义必须依赖于被触发事件的上下文约束,关于正确性的推理存在问题。 3.1.4分层系统 层次系统组织成一个层次结构,每一层为其上层服务,并作为其下层的客户。在一些层次系统中,除了一些精心挑选的输出函数外,内部的层只对相邻的层可见。这样的系统中构件在一些层实现了虚拟机(在另一些层次系统中层是部分不透明的)。连接件通过决定层间如何交互的协议来定义,拓扑约束包括对相邻层间交互的约束。 这种风格支持基于可增加抽象层的设计。这样,允许将一个复杂问题分解成一个增量步骤序列的实现。由于每一层最多影响两层,同时只要给相邻层提供相同的接口,允许每层用不同的方法实现,同样为软件重用提供了强大的支持。 图33是层次系统风格的示意图。层次系统最广泛的应用是分层通信协议。在这一应用领域,每一层提供一个抽象的功能,作为其上层通信的基础。较低的层次定义低层的交互,底层通常只定义硬件物理连接。 图33层次系统风格的体系结构 层次系统有许多可取的属性,如下所述。 (1) 支持基于抽象程度递增的系统设计,使设计师可以把一个复杂系统按递增的步骤进行分解。 (2) 支持功能增强。因为每一层至多和相邻的上下层交互,因此功能的改变最多影响相邻的上下层。 (3) 支持重用。只要提供的服务接口定义不变,同一层的不同实现可以交换使用。这样,就可以定义一组标准的接口,而允许各种不同的实现方法。 但是,层次系统也有其不足之处,如下所述。 (1) 并不是每个系统都可以很容易地划分为分层的模式,甚至即使一个系统的逻辑结构是层次化的,出于对系统性能的考虑,系统设计师不得不把一些低级或高级的功能综合起来。 (2) 很难找到一个合适的、正确的层次抽象方法。 3.1.5仓库系统及知识库 在仓库(repository)风格中,有两种不同的构件: 中央数据结构说明当前状态,独立构件在中央数据存储上执行,仓库与外构件间的相互作用在系统中会有大的变化。 控制原则的选取产生两个主要的子类。若输入流中某类时间触发进程执行的选择,则仓库是一传统型数据库; 若中央数据结构的当前状态触发进程执行的选择,则仓库是一黑板系统。 图34是黑板系统的组成。黑板系统的传统应用是信号处理领域,如语音和模式识别,另一应用是松耦合代理数据共享存取。 图34黑板系统的组成 从图34中可以看出,黑板系统主要由以下3部分组成。 (1) 知识源。知识源中包含独立的、与应用程序相关的知识。知识源之间不直接进行通信,它们之间的交互只通过黑板完成。 (2) 黑板数据结构。黑板数据是按照与应用程序相关的层次来组织的解决问题的数据,知识源通过不断地改变黑板数据来解决问题。 (3) 控制。控制完全由黑板的状态驱动,黑板状态的改变决定使用的特定知识。 3.1.6C2风格 C2体系结构风格可以概括为: 通过连接件绑定在一起的,按照一组规则运作的并行构件网络。C2体系结构风格中的系统组织规则如下。 (1) 系统中的构件和连接件都有一个顶部和一个底部。 (2) 构件的顶部应连接到某连接件的底部,构件的底部则应连接到某连接件的顶部,而构件与构件之间的直接连接是不允许的。 (3) 一个连接件可以和任意数目的其他构件和连接件连接。 (4) 当两个连接件进行直接连接时,必须由其中一个的底部到另一个的顶部。 图35是C2体系结构风格的示意图。图中构件与连接件之间的连接体现了C2体系结构风格中构建系统的规则。 图35C2体系结构风格 C2体系结构风格是最常用的一种软件体系结构风格。从C2体系结构风格的组织规则和结构图中可以得出,C2体系结构风格具有以下特点。 (1) 系统中的构件可实现应用需求,并能将任意复杂度的功能封装在一起。 (2) 所有构件之间的通信是通过以连接件为中介的异步消息交换机制来实现的。 (3) 构件相对独立,构件之间依赖性较少。系统中不存在某些构件将在同一地址空间内执行,或某些构件共享特定控制线程之类的相关性假设。 3.2客户/服务器风格 客户/服务器(Client/Server,C/S)计算技术在信息产业中占有重要的地位。网络计算经历了从基于宿主机的计算模型到客户/服务器计算模型的演变。 在集中式计算技术时代广泛使用的是大型计算机/小型计算机计算模型。它是通过一台物理上与宿主机相连接的非智能终端来实现宿主机上的应用程序。在多用户环境中,宿主机应用程序既负责与用户的交互,又负责对数据的管理: 宿主机上的应用程序一般也分为与用户交互的前端和管理数据的后端,即数据库管理系统(DataBase Management System,DBMS)。集中式的系统使用户能共享贵重的硬件设备,如磁盘机、打印机、调制解调器等。但随着用户的增多,对宿主机能力的要求很高,而且开发者必须为每个新的应用重新设计同样的数据管理构件。 20世纪80年代以后,集中式结构逐渐被以PC为主的微型计算机网络所取代。个人计算机和工作站的采用,彻底改变了协作计算模型,从而导致了分散的个人计算模型的产生。一方面,由于大型计算机系统固有的缺陷,如缺乏灵活性、无法适应信息量急剧增长的需求,并为整个企业提供全面的解决方案等; 另一方面,由于微处理器的日新月异,其强大的处理能力和低廉的价格使微型计算机网络迅速发展,已不仅仅是简单的个人系统,这便形成了计算机界的向下规模化(downsizing)。其主要优点是用户可以选择适合自己需要的工作站、操作系统和应用程序。 C/S软件体系结构是基于资源不对等,且为实现共享而提出来的,是20世纪90年代成熟起来的技术,C/S体系结构定义了工作站如何与服务器相连,以实现数据和应用分布到多个处理机上。C/S体系结构有三个主要组成部分: 数据库服务器、客户应用程序和网络,如图36所示。 图36C/S体系结构示意图 服务器负责有效地管理系统的资源,其任务集中于以下几项。 (1) 数据库安全性的要求。 (2) 数据库访问并发性的控制。 (3) 数据库前端的客户应用程序的全局数据完整性规则。 (4) 数据库的备份与恢复。 客户应用程序的主要任务如下。 (1) 提供用户与数据库交互的界面。 (2) 向数据库服务器提交用户请求并接收来自数据库服务器的信息。 (3) 利用客户应用程序对存在于客户端的数据执行应用逻辑要求。 网络通信软件的主要作用是完成数据库服务器和客户应用程序之间的数据传输。 C/S体系结构将应用一分为二,服务器(后台)负责数据管理,客户机(前台)完成与用户的交互任务。服务器为多个客户应用程序管理数据,而客户程序发送、请求和分析从服务器接收的数据,这是一种“胖客户机(fat client)”,“瘦服务器(thin server)”的体系结构。其数据流图如图37所示。 图37C/S体系结构的一般处理流程 在一个C/S体系结构的软件系统中,客户应用程序是针对一个小的、特定的数据集,如一个表的行来进行操作,而不是像文件服务器那样针对整个文件进行操作,对某一条记录进行封锁,而不是对整个文件进行封锁,因此保证了系统的并发性,并使网络上传输的数据量减到最少,从而改善了系统的性能。 C/S体系结构的优点主要在于系统的客户应用程序和服务器构件分别运行在不同的计算机上,系统中每台服务器都可以适合各构件的要求,这对于硬件和软件的变化显示出极大的适应性和灵活性,而且易于对系统进行扩充和缩小。在C/S体系结构中,系统中的功能构件充分隔离,客户应用程序的开发集中于数据的显示和分析,而数据库服务器的开发则集中于数据的管理,不必在每一个新的应用程序中都要对一个DBMS进行编码。将大的应用处理任务分布到许多通过网络连接的低成本计算机上,以节约大量费用。 C/S 体系结构具有强大的数据操作和事务处理能力,模型思想简单,易于人们理解和接受。但随着企业规模的日益扩大,软件的复杂程度不断提高,C/S体系结构逐渐暴露了以下缺点: (1) 开发成本较高。C/S 体系结构对客户端软硬件配置要求较高,尤其是软件的不断升级,对硬件要求不断提高,增加了整个系统的成本,且客户端变得越来越臃肿。 (2) 客户端程序设计复杂。采用C/S体系结构进行软件开发,大部分工作量放在客户端的程序设计上,客户端显得十分庞大。 (3) 信息内容和形式单一。传统应用一般为事务处理,界面基本遵循数据库的字段解释,开发之初就已确定,而且不能随时截取办公信息、档案等外部信息,用户获得的只是单纯的字符和数字,既枯燥又死板。 (4) 用户界面风格不一,使用繁杂,不利于推广。 (5) 软件移植困难。采用不同开发工具或平台开发的软件,一般互不兼容,不能或很难移植到其他平台上运行。 (6) 软件维护和升级困难。采用C/S体系结构的软件要升级,开发人员必须到现场为客户机升级,每个客户机上的软件都需维护。对软件的一个小小改动(如只改动一个变量),每一个客户端都必须更新。 (7) 新技术不能轻易应用。一个软件平台及开发工具一旦选定,不可能轻易更改。 3.3三层C/S体系结构风格 C/S 体系结构具有强大的数据操作和事务处理能力,模型思想简单,易于人们理解和接受。但随着企业规模的日益扩大,软件的复杂程度不断提高,传统的两层C/S体系结构存在以下几个局限。 (1) 两层C/S体系结构是单一服务器且以局域网为中心的,因此难以扩展至大型企业广域网或Internet。 (2) 软、硬件的组合及集成能力有限。 (3) 客户机的负荷太重,难以管理大量的客户机,系统的性能容易变坏。 (4) 数据安全性不好。因为客户端程序可以直接访问数据库服务器,那么,在客户端计算机上的其他程序也可想办法访问数据库服务器,从而使数据库的安全性受到威胁。 由于两层C/S体系结构的这些局限,三层C/S体系结构应运而生,其结构如图38所示。 图38三层C/S体系结构示意图 与两层C/S体系结构相比,三层C/S体系结构中,增加了一个应用服务器。将整个应用逻辑驻留在应用服务器上,只有表示层存在于客户机上,这种结构被称为瘦客户机(thin client)。 3.3.1各层的功能 三层C/S体系结构是将应用功能分成表示层、功能层和数据层三个部分,如图39所示。 图39三层C/S体系结构的一般处理流程 1. 表示层 表示层是应用的用户接口部分,它担负着用户与应用间的对话功能。它用于检查用户从键盘等输入的数据,显示应用输出的数据。为使用户能直观地进行操作,一般要使用图形用户界面(Graphic User Interface,GUI),操作简单,易学易用。在变更用户界面时,只需改写显示控制和数据检查程序,而不影响其他两层。检查的内容也只限于数据的形式和取值的范围,不包括有关业务本身的处理逻辑。 2. 功能层 功能层相当于应用的本体,它是将具体的业务处理逻辑编入程序。例如,在制作订购合同时要计算合同金额,按照定好的格式配置数据、打印订购合同,而处理所需的数据则要从表示层或数据层取得。表示层和功能层之间的数据交往要尽可能简捷。例如,用户检索数据时,要设法将有关检索要求的信息一次性地传送给功能层; 而由功能层处理过的检索结果数据也一次性地传送给表示层。 通常,在功能层中包含确认用户对应用和数据库存取权限的功能以及记录系统处理日志的功能。功能层的程序多半是用可视化编程工具开发的,也有使用COBOL和C语言的。 3. 数据层 数据层就是数据库管理系统,负责管理对数据库数据的读写。数据库管理系统必须能迅速执行大量数据的更新和检索。现在的主流是关系型数据库管理系统(RDBMS),因此,一般从功能层传送到数据层的要求大都使用SQL。 三层C/S的解决方案是: 对这三层进行明确分割,并在逻辑上使其独立。原来的数据层作为数据库管理系统已经独立,所以,关键是要将表示层和功能层分离成各自独立的程序,并且还要使这两层间的接口简洁明了。 一般情况是: 只将表示层配置在客户机中,如图310中(1)或(2)所示。如果像图310中(3)所示的那样连功能层也放在客户机中,与两层C/S体系结构相比,其程序的可维护性要好得多,但是其他问题并未得到解决。客户机的负荷太重,其业务处理所需的数据要从服务器传给客户机,所以系统的性能容易变坏。 图310三层C/S物理结构比较 如果将功能层和数据层分别放在不同的服务器中,如图310中(2)所示,则服务器和服务器之间也要进行数据传送。由于在这种形态中三层是分别放在各自不同的硬件系统上的,所以灵活性很高,能够适应客户机数目的增加和处理负荷的变动。例如,在追加新业务处理时,可以相应增加装载功能层的服务器。因此,系统规模越大这种形态的优点就越显著。 在三层C/S体系结构中,中间件是最重要的构件。所谓中间件是一个用API定义的软件层,是具有强大通信能力和良好可扩展性的分布式软件管理框架。它的功能是在客户机和服务器或者服务器和服务器之间传送数据,实现客户机群和服务器群之间的通信。其工作流程是: 在客户机里的应用程序需要驻留网络上某个服务器的数据或服务时,搜索此数据的C/S应用程序须访问中间件系统。该系统将查找数据源或服务,并在发送应用程序请求后重新打包响应,将其传送回应用程序。 3.3.2三层C/S体系结构应用实例 本小节通过某石油管理局劳动管理系统的设计与开发,来介绍三层C/S体系结构的应用。 1. 系统背景介绍 该石油管理局是国有特大型企业,其劳动管理信息系统(Management Information System,MIS)具有较强的特点。 (1) 信息量大。须存储并维护全油田近20万名职工的基本信息以及其他各种管理信息。 (2) 单位多,分布广。系统涵盖70多个单位,分布范围8万余平方千米。 (3) 用户类型多、数量大。劳动管理工作涉及管理局(一级)、厂矿(二级)和基层大队(三级)三个层次,各层次的业务职责不同,各层次领导对系统的查询功能的要求和权限也不同,系统用户总数达700多个。 (4) 网络环境不断发展。70多个二级单位中有40多个连入广域网,其他二级单位只有局域网,而绝大部分三级单位只有单机,需要陆续接入广域网,而已建成的广域网仅有骨干线路速度为100Mb/s,大部分外围线路速率只有64kb/s~2Mb/s。 项目要求系统应具备较强的适应能力和演化能力,不论单机还是网络环境均能运行,并保证数据的一致性,且能随着网络环境的改善和管理水平的提高平稳地从单机方式向网络方式,从集中式数据库向分布式数据库方式,以及从独立的应用程序方式向适应Intranet环境的方式(简称Intranet方式)演化。 2. 系统分析与设计  三层C/S体系结构运用事务分离的原则将MIS应用分为表示层、功能层和数据层3个层次。每一层次都有自己的特点: 表示层是图形化的、事件驱动的; 功能层是过程化的; 数据层则是结构化和非过程化的,难以用传统的结构化分析与设计技术统一表达这3个层次。面向对象的分析与设计技术则可以将这3个层次统一利用对象的概念进行表达。当前有很多面向对象的分析和设计方法,采用Coad 和Yourdon 的OOA(ObjectOriented Anaylzing,面向对象的分析)与OOD(ObjectOriented Design,面向对象的设计)技术进行三层结构的分析与设计。 在MIS的三层结构中,中间的功能层是关键。运行MIS应用程序的最基本的任务就是执行数千条定义业务如何运转的业务逻辑。一个业务处理过程就是一组业务处理规则的集合。中间层反映的是应用域模型,是MIS系统的核心内容。 Coad 和Yourdon 的OOA用于理解和掌握MIS应用域的业务运行框架,也就是应用域建模。OOA模型描述应用域中的对象,以及对象间各种各样的结构关系和通信关系。OOA模型有两个用途。首先,每个软件系统都建立在特定的现实世界中,OOA模型就是用来形式化该现实世界的“视图”。它建立起各种对象,分别表示软件系统主要的组织结构以及现实世界强加给软件系统的各种规则和约束条件。其次,给定一组对象,OOA模型规定了它们如何协同才能完成软件系统所指定的工作。这种协同在模型中以表明对象之间通信方式的一组消息连接来表示。 OOA模型划分为5个层次或视图,分别如下。 (1) 对象类层。表示待开发系统的基本构造块。对象都是现实世界中应用域概念的抽象。这一层是整个OOA模型的基础,在劳动管理信息系统中存在一百多个类。 (2) 属性层。对象所存储(或容纳)的数据称为对象的属性。类的实例之间互相约束,它们必须遵从应用域的某些限制条件或业务规则,这些约束称为实例连接。对象的属性和实例连接共同组成了OOA模型的属性层。属性层的业务规则是MIS中最易变化的部分。 (3) 服务层。对象的服务加上对象实例之间的消息通信共同组成了OOA模型的服务层。服务层中的服务包含业务执行过程中的一部分业务处理逻辑,也是MIS中容易改变的部分。 (4) 结构层。结构层负责捕捉特定应用域的结构关系。分类结构表示类属成员的构成,反映通用性和特殊性。组装结构表示聚合,反映整体和组成部分。 (5) 主题层。主题层用于将对象归类到各个主题中,以简化OOA模型。为了简化劳动管理信息系统,将整个系统按业务职能划分为13个主题,分别为: 职工基本信息管理,工资管理,劳动组织计划管理,劳动定员定额管理,劳动合同管理,劳动统计管理,职工考核鉴定管理,劳动保险管理,劳动力市场管理,劳动政策查询管理,领导查询系统,系统维护管理和系统安全控制。 在OOD方法中,OOD体系结构以OOA模型为设计模型的雏形。OOD将OOA的模型作为OOD的问题论域部分(PDC),并增加其他3个部分: 人机交互部分(HIC)、任务管理部分(TMC)和数据管理部分(DMC)。各部分与PDC一样划分为5个层次,但是针对系统的不同方面。OOD的任务是将OOA所建立的应用模型计算机化,OOD所增加的3个部分是为应用模型添加计算机的特征。 (1) 问题论域部分: 以OOA模型为基础,包含执行基本应用功能的对象,可逐步细化,使其最终能解决实现限制、特性要求、性能缺陷等方面的问题,PDC封装了应用服务器功能层的业务逻辑。 (2) 人机交互部分: 指定了用于系统的某个特定实现的界面技术,在系统行为和用户界面的实现技术之间架起了一座桥梁。HIC封装了客户层的界面表达逻辑。 (3) 任务管理部分: 把有关特定平台的处理机制底层系统的其他部分隐藏了起来。在该项目中,利用TMC实现分布式数据库的一致性管理。在三层C/S体系结构中,TMC是应用服务器的一个组成部分。 (4) 数据管理部分: 定义了与所有数据库技术接口的对象。DMC同样是三层结构中应用服务器的一部分。由于DMC封装了数据库访问逻辑,使应用独立于特定厂商的数据库产品,便于系统的移植和分发。 图311OOD与三层C/S 体系结构 OOD的4个部分与三层结构的对应关系如图311所示。 3. 系统实现与配置 三层C/S体系结构提供了良好的结构扩展能力。三层结构在本质上是一种开发分布式应用程序的框架,在系统实现时可采用支持分布式应用的构件技术实现。 当前,有3种分布式构件标准: Microsoft的DCOM、OMG的CORBA和Sun的 JavaBeans。这3种构件标准各有特点。考虑到在该项目应用环境的客户端和应用服务器均采用Windows 98/2000和Windows NT/2000,采用在这些平台上具有较高效率的支持DCOM的ActiveX方式实现客户端和应用服务器的程序。 ActiveX可将程序逻辑封装,并划分到进程内、本地或远程进程外执行。为了将应用程序划分到不同的构件里面,引入“服务模型”的概念。服务模型提供了一种逻辑性(非物理性)的方式,如图312所示。 图312服务模型结构图 “服务模型”是对所创建的构件进行分组的一种逻辑方式,这种模型与语言无关。服务模型基于这样一个概念: 每个构件都是一系列服务的集合,这些服务由构件提供给其他对象。 创建应用方案的时候,共有3种类型的服务可供选用: 用户服务、业务服务以及数据服务。每种服务类型都对应于三层C/S体系结构中的某一层。在服务模型里,为实现构件间的相互通信,必须遵守以下两条基本的规则。 (1) 一个构件能向当前层及构件层上下的任何一个层的其他构件发出服务请示。 (2) 不能跳层发出服务请求。用户服务层内的构件不能直接与数据服务层内的构件通信,反之亦然。 在劳动管理信息系统的实现中,将PDC的13个子系统以及TMC和DMC分别用单独的构件实现。这样,系统可根据各单位的实际情况进行组合,实现系统的灵活配置。而且这些构件还可以作为一个部件用于构造新的更大的MIS。 根据各种用户不同阶段对系统的不同需求以及系统未来的演化可能,拟定了如下几种不同的应用配置方案: 单机配置方案、单服务器配置方案、业务服务器配置方案和事务服务器配置方案。 1) 单机配置方案 对于未能连入广域网的二级单位和三级单位中的单机用户,将三层结构的所有构件连同数据库系统均安装在同一台机器上,与中心数据库的数据交换采用拨号上网或交换磁介质的方式完成。当它连入广域网时,可根据业务量情况采用单服务器配置方案或业务服务器配置方案。 2) 单服务器配置方案 对于已建有局域网的二级单位,当建立了本地数据库且其系统负载不大时,可将业务服务构件与数据服务构件配置在同一台物理服务器中,而应用客户(表示层)构件在各用户的计算机内安装。 3) 业务服务器配置方案 这是三层结构的理想配置方案。工作负荷大的单位采用将业务服务构件和数据服务构件分别配置于独立的物理服务器内以改善性能。该方案也适用于暂时不建立自己的数据库,而使用局劳资处的中心数据库的单位,此时只需建立一台业务服务器。该单位需要建立自己的数据库时,只需把业务服务器的数据库访问接口改动一下,其他方面无须任何改变。 4) 事务服务器配置方案 当系统采用Intranet方式提供服务时,将应用客户由构件方式改为Web页面方式,应用客户与业务服务构件之间的联系由Web服务器与事务服务器之间的连接提供,事务服务器对业务服务构件进行统一管理和调度,业务服务构件和数据服务构件不必做任何修改,这样既可以保证以前的投资不受损失,又可以保证业务运行的稳定性。向Intranet方式的转移是渐进的,两种运行方式将长期共存,如图313所示。 图313向Intranet方式的转移 在上述各种方案中,除了单机配置方案,其他方案均能对系统的维护和安全管理提供极大方便。任何应用程序的更新只需在对应的服务器上更新有关的构件即可。安全性则由在服务器上对操作应用构件的用户进行相应授权来保障。由于任何用户不直接拥有对数据库的访问权限,其操作必须通过系统提供的构件进行,这样就保证了系统的数据不被滥用,具有很高的安全性。同时,三层C/S体系结构具有很强的可扩展性,可以根据需要选择不同的配置方案,并且在应用扩展时方便地转移为另一种配置。 3.3.3三层C/S体系结构的优点 根据三层C/S的概念及使用实例可以看出,与两层C/S体系结构相比,三层C/S体系结构具有以下优点。 (1) 允许合理地划分三层结构的功能,使之在逻辑上保持相对独立性,从而使整个系统的逻辑结构更为清晰,能提高系统和软件的可维护性和可扩展性。 (2) 允许更灵活有效地选用相应的平台和硬件系统,使之在处理负荷能力上与处理特性上分别适应于结构清晰的三层; 并且这些平台和各个组成部分可以具有良好的可升级性和开放性。例如,最初用一台UNIX工作站作为服务器,将数据层和功能层都配置在这台服务器上。随着业务的发展,用户数和数据量逐渐增加,这时,就可以将UNIX工作站作为功能层的专用服务器,另外追加一台专用于数据层的服务器。若业务进一步扩大,用户数进一步增加,则可以继续增加功能层的服务器数目,用以分割数据库。清晰、合理地分割三层结构并使其独立,可以使系统构成的变更非常简单。因此,被分成三层的应用基本上不需要修正。 (3) 三层C/S体系结构中,应用的各层可以并行开发,各层也可以选择各自最适合的开发语言。使之能并行地、高效地进行开发,达到较高的性能价格比; 对每一层的处理逻辑的开发和维护也会更容易些。 (4) 允许充分利用功能层有效地隔离开表示层与数据层。未授权的用户难以绕过功能层而利用数据库工具或黑客手段去非法地访问数据层,这就为严格的安全管理奠定了坚实的基础; 整个系统的管理层次也更加合理和可控制。 值得注意的是: 三层C/S体系结构各层间的通信效率若不高,即使分配给各层的硬件能力很强,其作为整体来说也达不到所要求的性能。此外,设计时必须慎重考虑三层间的通信方法、通信频度及数据量。这和提高各层的独立性一样,是三层C/S体系结构的关键问题。 3.4浏览/服务器风格 在三层C/S体系结构中,表示层负责处理用户的输入和向客户的输出(出于效率的考虑,它可能在向上传输用户的输入前进行合法性验证)。功能层负责建立数据库的连接,根据用户的请求生成访问数据库的SQL语句,并把结果返回给客户端。数据层负责实际的数据库存储和检索,响应功能层的数据处理请求,并将结果返回给功能层。 浏览/服务器(BrowserServer,B/S)风格就是上述三层应用结构的一种实现方式,其具体结构为: 浏览器/Web服务器/数据库服务器。采用B/S体系结构的计算机应用系统的基本框架如图314所示。 图314B/S模式结构 B/S体系结构主要是利用不断成熟的WWW浏览器技术,结合浏览器的多种脚本语言,用通用浏览器就实现了原来需要复杂的专用软件才能实现的强大功能,并节约了开发成本。从某种程度上来说,B/S体系结构是一种全新的软件体系结构。 在B/S体系结构中,除了数据库服务器外,应用程序以网页形式存放于Web服务器上,用户运行某个应用程序时只需要在客户端上的浏览器中输入相应的网址,调用Web服务器上的应用程序并对数据库进行操作完成相应的数据处理工作,最后将结果通过浏览器显示给用户。可以说,在B/S模式的计算机应用系统中,应用(程序)在一定程度上具有集中特征。 基于B/S体系结构的软件,系统安装、修改和维护全在服务器端解决。用户在使用系统时,仅需要一个浏览器就可运行全部的模块,真正达到了“零客户端”的功能,很容易在运行时自动升级。B/S体系结构还提供了异种机、异种网、异种应用服务的联机、联网、统一服务的最现实的开放性基础。 B/S体系结构出现之前,管理信息系统的功能覆盖范围主要是组织内部。B/S体系结构的“零客户端”方式,使组织的供应商和客户(这些供应商和客户有可能是潜在的,也就是说可能是未知的)的计算机方便地成为管理信息系统的客户端,进而在限定的功能范围内查询组织相关信息,完成与组织的各种业务往来的数据交换和处理工作,扩大了组织计算机应用系统的功能覆盖范围,可以更加充分利用网络上的各种资源,同时应用程序维护的工作量也大大减少。另外,B/S体系结构的计算机应用系统与Internet的结合也使新的企业计算机应用(如电子商务,客户关系管理)的实现成为可能。 与C/S体系结构相比,B/S体系结构也有许多不足之处,例如: (1) B/S体系结构缺乏对动态页面的支持能力,没有集成有效的数据库处理功能。 (2) B/S体系结构的系统扩展能力差,安全性难以控制。 (3) 采用B/S体系结构的应用系统,在数据查询等响应速度上,要远远低于C/S体系结构。 (4) B/S体系结构的数据提交一般以页面为单位,数据的动态交互性不强,不利于在线事务处理(OnLine Transaction Processing,OLTP)应用。 因此,虽然B/S体系结构的计算机应用系统有如此多的优越性,但由于C/S体系结构的成熟性且C/S体系结构的计算机应用系统网络负载较小,因此,未来一段时间内,将是B/S体系结构和C/S体系结构共存的情况。但是,很显然,计算机应用系统计算模式的发展趋势是向B/S体系结构转变。 3.5公共对象请求代理体系结构 CORBA是由OMG制定的一个工业标准,其主要目标是提供一种机制,使得对象可以透明地发出请求和获得应答,从而建立一个异质的分布式应用环境。 由于分布式对象计算技术具有明显优势,OMG提出CORBA规范来适应该技术的进一步发展。1991年,OMG基于面向对象技术,给出了以对象请求代理(Object Request Broker,ORB)为中心的对象管理结构,如图315所示。 图315对象管理结构 在OMG的对象管理结构中,ORB是一个关键的通信机制,它以实现互操作性为主要目标,处理对象之间的消息分布。对象服务实现基本的对象创建和管理功能,通用服务则使用对象管理结构所规定的类接口实现一些通用功能。 3.5.1CORBA技术规范 针对ORB,OMG进一步提出了CORBA技术规范,主要内容包括接口定义语言(Interface Definition Language,IDL)、接口池(Interface Repository,IR)、动态调用接口(Dynamic Invocation Interface,DII)、对象适配器(Object Adapter,OA)等。 1. 接口定义语言 CORBA利用IDL统一地描述服务器对象(向调用者提供服务的对象)的接口。IDL本身也是面向对象的。它虽然不是编程语言,但它为客户对象(发出服务请求的对象)提供了语言的独立性,因为客户对象只需了解服务器对象的IDL接口,不必知道其编程语言。IDL语言是CORBA规范中定义的一种中性语言,它用来描述对象的接口,而不涉及对象的具体实现。在CORBA中定义了IDL语言到C、C++、SmallTalk和Java语言的映射。 2. 接口池 CORBA的接口池包括分布计算环境中所有可用的服务器对象的接口表示。它使动态搜索可用服务器的接口、动态构造请求及参数成为可能。 3. 动态调用接口 CORBA的动态调用接口提供了一些标准函数以供客户对象动态创建请求、动态构造请求参数。客户对象将动态调用接口与接口池配合使用可实现服务器对象接口的动态搜索、请求及参数的动态构造与动态发送。当然,只要客户对象在编译之前能够确定服务器对象的IDL接口,CORBA也允许客户对象使用静态调用机制。静态机制的灵活性虽不及动态机制,但其执行效率却胜过动态机制。 4. 对象适配器 在CORBA中,对象适配器用于屏蔽ORB内核的实现细节,为服务器对象的实现者提供抽象接口,以便他们使用ORB内部的某些功能。这些功能包括服务器对象的登录与激活、客户请求的认证等。 CORBA定义了一种面向对象的软件构件构造方法,使不同的应用可以共享由此构造出来的软件构件。每个对象都将其内部操作细节封装起来,同时又向外界提供精确定义的接口,从而降低了应用系统的复杂性,也降低了软件开发费用。CORBA的平台无关性实现了对象的跨平台引用,开发人员可以在更大的范围内选择最实用的对象加入到自己的应用系统之中。CORBA的语言无关性使开发人员可以在更大的范围内利用别人的编程技能和成果。 3.5.2CORBA风格分析 CORBA的设计词汇表 = [构件 ::= 客户机系统/服务器系统/其他构件; 连接件 ::= 请求/服务]。其中,客户机系统包括客户机应用程序、客户桩(stump)、上下文对象、接口仓库等构件,以及桩类型激发API、动态激发API等连接件。服务器系统包括服务器应用程序方法库,服务器框架、对象请求代理等构件,以及对象适配器等连接件。CORBA的体系结构模式如图316所示。 图316CORBA的体系结构模式 CORBA体系结构中,客户机应用程序用桩类型激发API或者动态激发API向服务器发送请求。在服务器端接受方法调用请求,不进行参数引导,设置需要的上下文状态,激发服务器框架中的方法调度器,引导输出参数,并完成激发。服务器应用程序使用服务器端的服务部分,它包含某个对象的一个或者多个实现,用于满足客户机对指定对象上的某个操作的请求。 很明显,客户机系统是独立于服务器系统的,同样,服务器系统也独立于客户机系统。 CORBA体系结构模式充分利用了现今软件技术发展的最新成果,在基于网络的分布式应用环境下实现应用软件的集成,使得面向对象的软件在分布、异构环境下实现可重用、可移植和互操作。其特点可以总结为如下几个方面。 (1) 引入中间件作为事务代理,完成客户机向服务对象方(Server)提出的业务请求。引入中间件概念后分布计算模式如图317所示。 图317引入中间件后客户机与服务器之间的关系 (2) 实现客户与服务对象的完全分离,客户不需要了解服务对象的实现过程以及具体位置。 (3) 提供软总线机制,使得在任何环境下、采用任何语言开发的软件只要符合接口规范的定义,均能够集成到分布式系统中。 (4) CORBA规范软件系统采用面向对象的软件实现方法开发应用系统,实现对象内部细节的完整封装,保留对象方法的对外接口定义。 在以上特点中,最突出的是中间件的引入。对象模型是应用开发人员对客观事物属性和功能的具体抽象。由于CORBA使用了对象模型,将CORBA系统中所有的应用看成对象及相关操作的集合,因此通过对象请求代理,使CORBA系统中分布在网络中应用对象的获取只取决于网络的畅通性和服务对象特征获取的准确程度,而与对象的位置以及对象所处的设备环境无关。 3.6正交软件体系结构 正交(orthogonal)软件体系结构由组织层和线索的构件构成。层是由一组具有相同抽象级别的构件构成。线索是子系统的特例,由完成不同层次功能的构件组成(通过相互调用来关联),每一条线索完成整个系统中相对独立的一部分功能。每一条线索的实现与其他线索的实现无关或关联很少,在同一层中的构件之间是不存在相互调用的。 如果线索是相互独立的,即不同线索中的构件之间没有相互调用,那么这个结构就是完全正交的。从以上定义可以看出,正交软件体系结构是一种以垂直线索构件族为基础的层次化结构,其基本思想是把应用系统的结构按功能的正交相关性,垂直分割为若干线索(子系统),线索又分为几个层次,每个线索由多个具有不同层次功能和不同抽象级别的构件构成。各线索的相同层次的构件具有相同的抽象级别。因此,可以归纳正交软件体系结构的主要特征如下。 (1) 正交软件体系结构由完成不同功能的n(n > 1)个线索(子系统)组成。 (2) 系统具有m(m > 1)个不同抽象级别的层。 (3) 线索之间是相互独立的(正交的)。 (4) 系统有一个公共驱动层(一般为最高层)和公共数据结构(一般为最低层)。 对于大型的、复杂的软件系统,其子线索(一级子线索)还可以划分为更低一级的子线索(二级子线索),形成多级正交结构。正交软件体系结构的框架如图318所示。 图318正交软件体系结构的框架 图318是一个三级线索、五层结构的正交软件体系结构框架图。在该图中,ABDFK组成了一条线索,ACEJK也是一条线索。因为B、C处于同一层次中,所以不允许互相调用; H、J处于同一层次中,也不允许互相调用。一般来讲,第5层是一个物理数据库连接构件或设备构件,供整个系统公用。 在软件演化过程中,系统需求会不断发生变化。在正交软件体系结构中,因线索的正交性,每一个需求变动仅影响某一条线索,而不会涉及其他线索。这样,就把软件需求的变动局部化了,产生的影响也被限制在一定范围内,因此实现容易。 3.6.1正交软件体系结构的抽象模型 这一小节中将继续使用第2章对构件的定义,在此不再赘述。 定义1连接件L=。这里R是连接件中角色进程组成的集合,通常集合中有等于或多于两个的元素; G是胶水(Glue)的集合,该集合中只有一个元素。 定义2称两个构件Ci和Cj(j≠i)是相关的,如果存在连接件L,使得Ci与Cj之间有连接,记作Ci ←→LCj。否则,就称Ci和Cj是无关的。 定义3线索由构件和与这些构件相关的连接件组成,记作Th。 Th = {,Ci是构件,且Lj,使得Ci←→Lj Ci+1成立,0∈R; (2) 对SA的任意构件Ci,都有∈R; (3) 对SA的任意两个构件Ci,Cj,如果∈R,则∈R; (4) 对SA的任意三个构件Ci,Cj和Ck(i≠j≠k),如果∈R且∈R,则∈R。 定理2相关关系R是一个等价关系。 根据定义13,定理2的结论是显然的。 由于R是一个等价关系,对于软件体系结构SA的构件集合C={C1,C2,…,Cn},可以构造C关于R的商集C/R={Cr1,Cr2,…,Crn},C/R构成C的一个划分,CriC(i=1,2,…,n)。商集C/R是构件集合C上关于R的不同等价类的集合。因此,不同划分块中的构件之间无相关关系,同一划分块中的构件之间存在相关关系。对每一划分块Cri,定义一个线索Thi=Ci1Ci2,…,Cik(对不同的Thi,k值各不相同),且Cij∈Cri(j=1,2,…,k),i1