第9章 · 知识精要

软件架构设计

章节概述

软件架构是软件系统的高层结构,是系统在其生命周期中最早的设计决策体现。本章是系统架构设计师考试中最核心的章节之一,涵盖了软件架构从定义、风格、设计方法到评估的完整知识体系。软件架构设计就是软件系统的"布局谋篇",旨在站在较高的层面上整体地解决好软件的设计、复用、质量和维护等方面的实际问题。

本章内容极为丰富,涉及软件架构概述(定义、生命周期模型)、软件质量属性及其实现战术、五大架构风格分类(数据流、调用/返回、独立构件、虚拟机、仓库)、层次系统架构(C/S、B/S、MVC、MVP)、面向服务的架构(SOA、微服务)、架构设计方法(属性驱动设计ADD)、架构文档化、软件架构评估(ATAM、SAAM、CBAM)、构件及其复用、产品线及系统演化、特定领域软件架构DSSA、软件架构视图(4+1视图、模块/C&C/分配视图类型)等。在考试中,架构风格分类、质量属性、架构评估方法是高频考点。

从软件开发过程来看,软件架构的建立位于需求分析之后、概要设计之前。基于架构的软件开发模型将整个软件过程划分为架构需求、设计、文档化、评审(评估)、实现、演化等6个子过程。架构设计师需要深刻理解各种架构风格的适用场景、优缺点,掌握架构评估方法以预见和保证系统的质量属性。

知识结构框架

  • 9.1 软件架构概述 — 架构定义(3种权威定义)、架构重要性、架构5种模型(结构/框架/动态/过程/功能)、"4+1"视图模型(逻辑/开发/进程/物理/场景)
  • 9.2 架构需求与软件质量属性 — 运行期质量属性(性能/安全性/易用性/可伸缩性/互操作性/可靠性/鲁棒性等)、开发期质量属性(可扩展性/可重用性/可测试性/可维护性/可移植性)、6大质量属性战术(可用性/可修改性/性能/安全性/可测试性/易用性)
  • 9.3 软件架构风格 — 5大类:数据流风格(批处理/管道-过滤器)、调用/返回风格(主程序子程序/面向对象/层次结构)、独立构件风格(进程通信/事件系统)、虚拟机风格(解释器/基于规则)、仓库风格(数据库/超文本/黑板)
  • 9.4 层次系统架构风格 — 二层/三层C/S、B/S架构、MVC架构、MVP架构
  • 9.5 面向服务的架构 — SOA概述与设计原则、关键技术(UDDI/WSDL/SOAP/REST)、实现方法(Web Service/服务注册表/ESB)、微服务架构
  • 9.6 架构设计 — 演变交付生命周期模型、属性驱动设计法(ADD)、按架构组织开发团队、开发骨架系统
  • 9.7 软件架构文档化 — 视图编档(7部分结构)、跨视图文档、UML表示、架构重构(反向工程)
  • 9.8 软件架构评估 — 评估方法分类(调查问卷/场景/度量)、ATAM架构权衡分析法(9步骤)、CBAM成本效益分析法
  • 9.9 构件及其复用 — 商用构件标准(CORBA/J2EE/DNA 2000)、应用系统簇与构件系统、基于复用开发的组织结构
  • 9.10 产品线及系统演化 — 复用与产品线、基于产品线的架构、产品线开发模型(前瞻性/反应性)、DSSA特定领域软件架构、架构演化7步骤
  • 9.11 软件架构视图 — 视图3大类型(模块视图/C&C视图/分配视图)、各类型下的风格、视图间映射关系

核心概念

软件架构定义

系统的一个(或多个)结构,由软件元素、元素的外部可见属性及它们之间的关系组成。强调"外部可见"属性,架构是对系统的抽象,具有"基础"性,隐含"决策"。

架构风格

描述某一特定应用领域中系统组织方式的惯用模式,定义了一个系统家族。包含词汇表(构件和连接件类型)和一组约束(组合规则),反映领域共有的结构和语义特性。

数据流风格

包括批处理序列和管道-过滤器。数据按流的形式前进,不存在反复重构。批处理数据整体传递;管道-过滤器支持增量处理,典型应用为Unix Shell和传统编译器。

调用/返回风格

采用调用-返回机制,分而治之策略。包括主程序/子程序(结构化经典)、面向对象风格(数据抽象与封装)、层次结构(每层为上层服务、作下层客户)。

独立构件风格

构件相对独立,不直接通信,降低耦合度。包括进程通信(消息传递连接件)和事件系统(隐式调用,触发/广播事件,注册过程自动调用)。

虚拟机风格

构建运行环境以解析和运行自定义语言,增加架构灵活性。包括解释器(解释引擎+代码存储区+状态结构)和基于规则的系统(规则集+规则解释器+工作内存)。

仓库风格

中央数据结构说明当前状态,独立构件在其上执行。包括数据库系统(中央共享数据源+独立处理元素)、超文本系统(早期静态网页)、黑板系统(知识源+黑板数据+控制)。

DSSA

特定领域软件架构,支持在特定领域中有多个应用的生成。必备特征:严格定义的问题域/解决域、普遍性、合适抽象、可复用元素。活动阶段:领域分析→领域设计→领域实现。

产品线架构

针对一系列产品设计的通用架构,将共用模块事先实现供直接重用。三要点:必须考虑一系列明确许可的变化、必须文档化、必须提供"产品创建者指南"。开发模型分前瞻性和反应性。

中间件

构件标准规范包括CORBA(ORB软总线+公共对象服务+公共设施)、J2EE(RMI/IIOP+EJB业务逻辑层)、DNA 2000(COM/DCOM/COM+构件模型)。ESB企业服务总线是SOA的核心基础设施。

架构评估(ATAM)

架构权衡分析法,基于场景的评估方法。揭示架构如何满足质量需求及需求间交互作用。输出:架构表述、业务目标、场景集合、决策映射、敏感点/权衡点、风险/无风险决策、风险主题。

质量属性

运行期:性能、安全性、易用性、可伸缩性、互操作性、可靠性、鲁棒性;开发期:易理解性、可扩展性、可重用性、可测试性、可维护性、可移植性。架构重点关注6种:可用性、可修改性、性能、安全性、可测试性、易用性。

关键公式与规则

架构风格5大类分类表

┌───────────────┬──────────────────────────────────┐ │ 风格大类 │ 子风格 │ ├───────────────┼──────────────────────────────────┤ │ 1.数据流风格 │ 批处理序列 / 管道-过滤器 │ │ 2.调用/返回风格 │ 主程序-子程序 / 面向对象 / 层次结构 │ │ 3.独立构件风格 │ 进程通信 / 事件系统(隐式调用) │ │ 4.虚拟机风格 │ 解释器 / 基于规则的系统 │ │ 5.仓库风格 │ 数据库系统 / 超文本系统 / 黑板系统 │ └───────────────┴──────────────────────────────────┘

质量属性分类

【运行期质量属性】 性能 : 速度、吞吐量、持续高速性 安全性 : 兼顾向合法用户提供服务 + 阻止非授权使用 易用性 : 软件系统易于被使用的程度 可伸缩性: 用户数和数据量增加时维持高服务质量的能力 互操作性: 与其他系统交换数据和相互调用的难易程度 可靠性 : 一定时间内无故障运行的能力 鲁棒性 : 非正常情况下仍能正常运行(健壮性/容错性) 【开发期质量属性】 易理解性: 设计被开发人员理解的难易程度 可扩展性: 适应新需求增加新功能的能力(灵活性) 可重用性: 重用软件系统或某一部分的难易程度 可测试性: 测试以证明满足需求规范的难易程度 可维护性: 定位修改点并实施修改的难易程度 可移植性: 从一个运行环境转移到另一个的难易程度 【架构重点6大质量属性】(其他属性可归入) 可用性 | 可修改性 | 性能 | 安全性 | 可测试性 | 易用性

质量属性场景6要素

质量属性场景 = 刺激源 + 刺激 + 环境 + 制品 + 响应 + 响应度量 刺激源 : 生成该刺激的实体(人/系统/激励器) 刺激 : 刺激到达系统时可能产生的影响 环境 : 刺激在某条件内发生(如系统过载) 制品 : 系统中受刺激的部分 响应 : 刺激到达后所采取的行动 响应度量 : 以某种方式对应其度量(用于测试是否满足需求)

ATAM评估核心概念

【ATAM输出要素】 1. 架构表述(简洁,一小时内可表述) 2. 业务目标(表述清楚) 3. 场景集合(捕获质量需求) 4. 架构决策→质量需求的映射 5. 敏感点与权衡点集合 6. 有风险决策与无风险决策 7. 风险主题集合 【关键定义】 敏感点(Sensitivity Point) : 对一个或多个质量属性具有显著影响的架构决策 权衡点(Tradeoff Point) : 影响多个质量属性且方向相反的架构决策 例: 备份数据库 → 可靠性(+) / 性能(-) 风险点(Risk) : 有潜在问题、可能违反质量需求的架构决策 非风险点(Non-Risk) : 经分析认为可接受的架构决策 【ATAM 9步骤】 ① ATAM方法表述 → ② 商业动机表述 → ③ 架构表述 → ④ 架构方法分类 → ⑤ 生成质量属性效用树 → ⑥ 分析架构方法(探查场景) → ⑦ 集体讨论确定场景优先级 → ⑧ 分析架构方法(新场景) → ⑨ 结果表述 【效用树结构】 根 → 质量属性 → 属性求精(细分) → 场景(叶) 场景优先级 = (重要度H/M/L, 难易度H/M/L) 例: (H,L) = 重要且易实现 → 优先分析

架构评估方法对比

┌─────────────┬────────────────────────────────────┐ │ 方法 │ 特点 │ ├─────────────┼────────────────────────────────────┤ │ ATAM │ 基于场景, 分析质量属性间的交互与权衡 │ │ (架构权衡) │ 输出: 敏感点/权衡点/风险点/非风险点 │ ├─────────────┼────────────────────────────────────┤ │ SAAM │ 基于场景, 最早的方法, 侧重可修改性 │ │ (架构分析) │ 非功能属性的场景评估 │ ├─────────────┼────────────────────────────────────┤ │ ARID │ 架构适宜性, 针对部分架构的评估 │ │ (适宜性) │ 适合架构不完整时的评估 │ ├─────────────┼────────────────────────────────────┤ │ CBAM │ 在ATAM基础上, 从经济角度分析 │ │ (成本效益) │ 计算ROI, 按投资报酬率选择架构策略 │ └─────────────┴────────────────────────────────────┘

SOA关键技术

UDDI : 统一描述、发现和集成 → 服务发布/查找/定位(服务注册中心) WSDL : Web服务描述语言 → 描述服务接口与实现(基于XML) SOAP : 简单对象访问协议 → 消息传输规范(XML格式化+HTTP承载) 4部分: 封装 / 编码规则 / RPC表示 / 绑定 消息3部分: Envelope(信封) + Header(头,可选) + Body(体,必须) REST : 表述性状态转移 → 只用HTTP和XML, 操作: POST/GET/PUT/DELETE 准则: 所有事物抽象为资源 / 唯一资源标识 / 通用连接件接口 / 无状态 Web Service 6层架构: 底层传输层 → 服务通信协议层 → 服务描述层 → 服务层 → 业务流程层 → 服务注册层

考试要点

  • 架构风格5大类及代表实例:管道-过滤器=Unix Shell、传统编译器(词法→语法→语义→代码生成);黑板系统=AI/语音识别(HEARSAY-II);解释器=专家系统;层次结构=操作系统分层通信协议(如OSI七层模型);事件系统=编程环境工具集成、Debugger断点。
  • DSSA三要素/三阶段:领域分析(获得领域模型,是基础和关键)→领域设计(获得DSSA)→领域实现(开发可复用信息)。DSSA领域分垂直域(特定系统族)和水平域(多系统族共有功能)。
  • 产品线 vs 单产品架构:产品线架构必须考虑一系列明确许可的变化、必须文档化、必须提供"产品创建者指南"。开发模型分"前瞻性"(自上而下,战略决策)和"反应性"(自下而上,根据已有产品构建)。
  • 中间件/构件标准分类:CORBA(ORB软总线+公共对象服务+公共设施,CCM构件模型)、J2EE(RMI/IIOP,EJB=会话Bean+实体Bean,业务逻辑层中间件)、DNA 2000(COM/DCOM/COM+,负载均衡+对象池)。
  • 架构评估方法区别:ATAM=多场景质量属性分析+权衡(输出敏感点/权衡点/风险点/非风险点);SAAM=最早方法,侧重可修改性场景分析;ARID=架构适宜性评估(部分架构不完整时);CBAM=在ATAM基础上从经济角度计算ROI选择策略。
  • 质量属性六大类及战术:可用性(错误检测/恢复/预防)、可修改性(局部化修改/防止连锁反应/推迟绑定时间)、性能(资源需求/资源管理/资源仲裁)、安全性(抵抗攻击/检测攻击/从攻击恢复)、可测试性(输入输出/内部监控)、易用性(运行时/设计时/用户主动操作)。
  • ATAM输出四要素:敏感点、权衡点、风险点、非风险点。备份数据库是经典权衡点例子(可靠性↑性能↓)。
  • 4+1视图模型:逻辑视图(功能需求,面向对象)、开发视图(模块组织管理)、进程视图(运行特性,并发/分布/容错)、物理视图(软件映射到硬件)、场景视图(将四视图联系起来,最重要需求抽象)。逻辑+开发=静态结构;进程+物理=动态结构。
  • 架构视图3大类型:模块视图类型(分解/使用/分层/泛化风格)、C&C视图类型(管道过滤器/共享数据/发布订阅/客户机服务器/对等/通信进程风格)、分配视图类型(部署/实现/工作任务风格)。
  • 架构演化7步骤:需求变动归类→制订架构演化计划→修改/增加/删除构件→更新构件相互作用→构件组装与测试→技术评审→产生演化后的架构。
  • MVC vs MVP区别:MVC中View可直接从Model读取数据;MVP中View不直接使用Model,所有交互通过Presenter进行,Presenter依赖抽象化的IView接口,使UI逻辑易于测试。
  • 微服务核心特点:小且专注做一件事、轻量级通信(RESTful API)、松耦合、独立部署。优势:技术异构性、弹性、独立扩展、简化部署。挑战:分布式复杂度、运维成本、部署自动化、DevOps。

关键图示

图9-1 4+1视图模型

图9-1 "4+1"视图模型

从逻辑视图、开发视图、进程视图、物理视图和场景视图5个视角描述软件架构,每个视图只关心系统的一个侧面,5个视图结合才能反映架构全部内容。场景视图将其他四个视图有机联系起来。

图9-5 管道/过滤器风格示意图

图9-5 管道/过滤器风格示意图

管道/过滤器风格中每个构件(过滤器)读输入数据流,经内部处理后产生输出数据流,连接件(管道)将一个过滤器的输出传到另一过滤器的输入。典型应用:Unix Shell程序、传统编译器(词法分析→语法分析→语义分析→代码生成)。

图9-19 视图编档-接口文档内容

图9-19 视图编档中的接口文档内容

视图编档组织结构中的元素目录部分需要对接口进行编档,包括接口标识、语法(参数与返回类型)、语义(前置/后置条件)等内容,是架构文档化的重要组成部分。

图9-20 软件架构重构活动

图9-20 软件架构重构活动

架构重构是反向工程之一,以迭代方式进行4个活动:信息提取(View Extraction)→数据库构造(Database Construction)→视图融合(View Fusion)→重构(Reconstruction),最终生成架构文档。