系统架构设计

系统架构设计概述

  1. 软件架构设计(Software Architecture)解决了需求分析和设计阶段之间的鸿沟,是需求分析与设计阶段的过渡阶段。一个好的系统架构,能够使得系统在面对灾难性错误时不会产生严重的故障。
  2. 软件架构就是需求分配,将满足需求的职责分配到对应的组件上。
  3. 软件架构是软件在结构、行为和属性的高层次抽象。主要由构件的描述、构件之间的联系关系(连接子)、系统继承的模式和一组约束构成。
  4. 软件架构不仅规定了系统的组织架构和拓扑结构,还规定了组件与需求之间的映射关系。
  5. 软件架构解决的核心问题是软件的复用、质量和维护。
  6. 软件架构设计主要有以下三个活动:提出架构模型、进行架构设计、进行架构审核。其中架构设计主要关注软件架构的结构、属性和连接关系,并通过多视图全面描述特定模型的软件架构。
  7. 软件架构在设计更改相对容易的阶段,便于技术人员和非技术人员进行交互,从而展现软件的结构、属性和交互关系。
  8. 软件架构是可传递和可复用的模型。

软件架构和生命周期

  1. 需求分析阶段:传统的需求分析阶段主要产出的是问题空间,而软件架构在此阶段产生解空间。主要研究的问题是:如何将需求分析转化为软件架构SA;以及如何进行跟踪(包括正向跟踪和反向跟踪)
  2. 设计阶段:主要有三个活动:软件架构的描述、对软件架构进行分析和设计、对产生的设计经验进行总结和复用。其中对SA的描述可以有三个层次:SA的基本描述、体系结构描述语言ADL,SA的多视图。
  3. 实现阶段:软件架构的管理,可以使用项目管理工具;软件架构的实现,如何将SA过渡到具体实现,如何将SA的需求分配到对应构件上,可以采用程序设计语言的思想进行设计;软件架构的测试
  4. 组装阶段:SA给予了一个更高层次的蓝图,主要研究构件之间如何相互关联,也就是连接子的实现;此外还要解决这些构件之间的失配问题,包括构件的失配、连接子的失配以及结构产生的失配问题。
  5. 部署:SA可以为部署提供一个更好的解决方案
  6. 后开发阶段:进行软件架构的演化、复用和维护

构件

  1. 构件是一个可以独立部署并交付的功能单元,外界可以通过其接口进行访问。由多个原子构件构成,原子构件由模块和资源构成。原子构件是部署,版本控制和替换的基本单位,原子构件一般可以独立部署,但是不会独立部署。都是按照一组原子构件家族进行部署。
  2. 模块是不带资源的原子构件,一个模块可以包含多个类进行打包。
  3. 构件与对象的区别:构件的特征是可以独立部署且独立交付、作为第三方的组装单元,可以由第三方调用、对外隐藏自己状态;对象的特征是可以一个实例单元且有唯一标识、可以有自己的状态、对外进行封装。
  4. 构件接口规定了构件之间通信的格式、模式和协议,使得接口之间传递消息更具有规范性和一致性。
  5. 面向构件的编程一般要求具有:多态性(可以替换同接口的实现构件)、模块封装性(更高层次的隐藏)、独立部署性、安全性
  6. 目前市面上的主流构件有以下三类:
  • EJB(Enterprise Java Bean)是Sun公司提出的一种在Java平台的企业级构件模型,主要规定了三类构件bean,会话bean,实体bean和消息传递bean。使得企业开发能更加注重业务也就是实现这一些bean,提高工作效率,但是缺点是配置大于约定,配置过于复杂,对程序员要求高且不方便;
  • COM是微软公司提出的,只能在Windows平台进行开发的构建技术,还衍生出DCOM和COM+的技术
  • CORBA(Common Object Request Broker Architecture)公共对象请求代理架构,由OMG公司提出主要分为三个层次:ORB对象请求代理,针对异构的对象实现了不同的接口,定义了一条软总线能够将不同的对象转化成对上层统一的公共对象;公共对象基础服务,这一层在得到对象的基础上进行了一系列公共服务的抽象,例如并发控制、事务控制等;最后一层是对外的公共基础服务,此时可以对外暴露接口提供对象访问的服务了。

架构设计风格

  1. 软件架构设计风格是在特定领域下软件架构设计的惯用模式。主要由软件结构,一个词汇表和一组约束构成。词汇表包含架构中构件和连接件的描述,约束定义了这些组件之间的关系。
  2. 软件架构风格反应了在某特定领域下多种架构设计的共有结构和语义特性,能够指导子模块和子系统的有效集成和组成一个更大的系统。研究软件架构风格促进软件复用,能够将该领域已有的架构解决方案迁移到解决新的问题上。
  3. 软件复用是研究软件架构的一个核心问题
  4. 架构风格种类:数据流、调用-返回、独立构件、仓库、虚拟机

数据流风格

  1. 批处理风格:构件是一系列顺序排列的计算单元,构件之间通过数据进行连接,每个构件必须由上个构件处理完成之后才能开始处理,数据的传输是完整的。
  2. 管道-过滤器风格:每个构件都有输入和输出,构件读取输入的数据流,经过处理得到输出数据流。要求数据流顺序,输入必须是上一个构件产生的输出流,可以把并行。过滤器为构件,管道为连接子。一般出现在早期的编译器软件架构中。

调用-返回风格

  1. 主函数-子函数风格:单线程模型,将复杂问题分解为可以单独处理的子问题。子函数解决子问题,通过主函数进行调用。函数为构件,相互调用为连接子。
  2. 面向对象风格:对象即为构件,对象之间的相互作用,例如函数之间的方法调用和过程调用为连接子。
  3. 层次架构:构建为每一个层次,连接子为每个层次之间的调用关系。每一层都进行封装,为上一层提供接口,同时使用下一层的服务。修改层次时只会影响相邻的两层。这样的优点是:将一个复杂问题分解为若干的子问题;越靠近底层越抽象;可复用。缺点是:调用无法跨层,效率底;也不一定所有的系统都能划分为层次结构。

独立构件风格

  1. 进程通信:命名进程是构件,进程之间相互作用为连接子。一般有三种调用方式:点对点、同步/异步方式,rpc
  2. 隐式调用(事件驱动):构件不直接调用过程,而是通过触发或者广播一到多个事件。构件的过程可以由多个触发源进行定义,当构件接收到触发,就会使用已经定义好的函数过程进行调用,从而达到隐式和解耦的功能。这样的优点是增大了软件的复用性,缺点是放弃了软件调用过程的控制权。

虚拟机风格

  1. 解释器风格:由解释引擎,存放被解释程序的缓存区,存储解释引擎解释状态的数据结构和程序解释执行的具体位置的存储器构成。优点是规则可以自定义,缺点是慢
  2. 基于规则的系统:规则集,规则解释器,规则选择器,工作内存。一般用在ai和dss

数据风格

  1. 数据库风格:两个构件,数据库和多个独立的数据处理单元
  2. 黑板风格:知识源,黑板,控制。多个独立的知识处理单元,可以操作黑板进行演算。黑板是一个集中式数据库,可以通过知识源进行修改。一般适用于嵌入式系统、语音识别系统等复杂的没有固定解的系统
  3. 超文本风格:基于网络的

层次架构风格

  1. 两层C/S:表示层和数据层,表示层也可以存储数据,还要保证一致性,现已不用
  2. 三层C/S:表示层、功能层和数据层,表示层仅作展示。优点:管理更清晰;可以并行开发;可以选择适应的环境和开发平台;保持了逻辑独立性
  3. 三层B/S:客户端变成浏览器,访问慢了,安全性也不强
  4. 富互联网应用:小程序,看上去没有客户端,但是通过高速网络现场搭建,因此综合了B和C的优点
  5. MVC架构:模型、控制、视图。模型直接与视图交互,不安全
  6. MVP架构:模型、表示、视图。切断了模型与视图的直接交互,更安全

特定领域软件架构

基本概念

  1. 特定领域软件架构DSSA(Domain Specific Software Architecture)是一组在特定领域下的软件开发构件集合,是一组在特定领域下获取系统的参考结构,参考需求和领域模型的开发环境,目标就是生成一个或多个领域应用。
  2. 水平域和垂直域
  3. 三个基本活动:领域架构分析:目标是获取领域模型,找领域专家来定义领域范围和定义领域特定元素;领域架构设计:目标是获取DSSA;领域架构实现:软件架构重用
  4. 四个人员:领域专家、领域分析专家、领域设计专家、领域实现专家
  5. 五个过程:定义领域范围;定义领域特有的元素;定义领域特有的设计和约束;定义领域模型和实现;搜集并开发可重用元素
  6. 四个特征:有明确的问题域和解决域;适当程度的抽象;有可重用元素;在领域内有普遍性
  7. 三个开发环境和五个产出:领域开发环境、特定领域下的应用开发环境,应用实际环境。产出:领域结构,领域需求,架构,开发工具,领域模型。

基于架构的软件开发方法

  1. ABSD(Architecture Based Software Development)是由架构驱动,强调由软件业务,质量和功能需求指导软件架构设计。用视角和视图来描述软件的软件架构,以用例和质量属性场景来描述软件的需求。
  2. 使用ABSD方法可以在软件模型定义明确之后立刻进行设计
  3. 三个基础:功能的分解,需求分解到对应组件;软件架构风格;可重用的组件,软件模板
  4. 六个阶段:架构需求、架构设计、架构文档化、架构复审、架构实现、架构演化
  5. 架构需求三步:定义类图,类进行归类,产生包
  6. 架构设计五步:提出架构模型,需求切分,构件之间联系,产生架构,架构评审
  7. 架构文档化两个文档:架构规格说明书,测试架构需求的质量设计说明书

软件质量属性

  1. 质量属性分为开发时和运行时
  2. 八个质量属性和提升方法:
    • 性能:优先级队列,并发,增加计算资源,减少开销
    • 可用性/可靠性:容错容灾,心跳,ping\echo,选举
    • 安全性:入侵检测,用户认证,用户权限控制,追踪审计
    • 可修改性
    • 互操作性
    • 功能性
    • 可变性
  3. 质量属性场景六个要素:刺激源,刺激,场景,制品,响应,响应度量
  4. 敏感点:为了实现某种特定的质量属性,一个或多个构件所具有的特性
  5. 权衡点:影响多个质量属性的决策点,是多个质量属性的敏感点。