软件架构为系统提供结构、行为和属性的高级抽象。架构风格是特定领域的惯用模式,定义一个词汇表和一组约束。
| 作用 | 说明 | 考点关联 |
|---|---|---|
| 交流手段 | 项目干系人之间的沟通桥梁 | 与4+1视图紧密相关,不同角色看不同视图 |
| 可传递可复用 | 通过研究架构可预测软件质量 | 架构一锤,质量可预测 |
| 原型设计 | 有助于循序渐进的原型开发 | 支持渐进式原型设计 |
| 阶段 | 核心要点 | 考试指向 |
|---|---|---|
| 设计 ⭐ | SA研究最核心阶段,使用ADL和4+1视图 | 是各主客观试题中出现最多的 |
| 需求分析 | 根据需求构建SA模型,模型是否可追溯 | 模型可追溯性是检验架构的重要指标 |
| 实现 | 根据设计进行代码实现 | 代码实现与架构设计应一致 |
| 构件组装 | 高层次实现系统,强调效率 | 根据架构设计的构件制应可复用性 |
| 部署 | SA提供高层视图指导部署 | 物理视图有助于部署规划 |
| 后开发 | 系统结构动态变化,支持结构恢复与重建 | 运行期属性相关 |
从5个视角描述软件架构,不同角色关注不同视图。
| 视图 | 面向对象 | 关注点 | 核心内容 | 典型产出物 |
|---|---|---|---|---|
| 逻辑视图 | 用户/设计者 | 功能需求 | 类、对象 | 类图、对象图、状态图 |
| 开发视图 | 程序员 | 代码结构 | 配置、装配 | 包图、组件图 |
| 进程视图 | 系统集成人员 | 运行时行为 | 并发、性能、吞吐量 | 活动图、序列图 |
| 物理视图 | 系统工程师 | 部署结构 | 硬件节点、网络拓扑 | 部署图、网络拓扑图 |
| 用例视图(场景) | 分析/测试人员 | 功能场景 | 驱动其他4个视图 | 用例图 |
| 视图 | 推荐UML图 | 说明 |
|---|---|---|
| 逻辑视图 | 类图、对象图、状态图 | 描述系统的静态结构和对象状态变化 |
| 开发视图 | 组件图、包图 | 描述系统的物理代码组织 |
| 进程视图 | 活动图、序列图 | 描述系统的动态行为和并发 |
| 物理视图 | 部署图 | 描述软硬件映射和拓扑 |
| 用例视图 | 用例图 | 描述功能需求和使用场景 |
一种形式化语言,为软件系统的概念体系结构提供具体的语法和概念框架。
| 要素 | 定义 | 类比 | 关键特性 |
|---|---|---|---|
| 构件 | 计算或数据存储单元 | 房间的墙壁 | 具有独立功能的计算/存储单元 |
| 连接件 | 构件之间交互的构造块及规则 | 房间的门和走廊 | 定义构件间的交互协议和规则 |
| 架构配置 | 构件与连接件的链接图 | 房间的平面图 | 描述构件和连接件的拓扑关系 |
三者关系:构件通过连接件进行交互,多个构件和连接件共同组成架构配置。
| ADL | 特点 | 适用场景 | 核心机制 |
|---|---|---|---|
| C2 | 基于组件和消息,支持分层 | GUI系统、分布式系统 | 顶层组件、底层组件、消息总线 |
| Wright | 基于CSP通信理论,形式化 | 分布式和并发系统建模 | 通信协议的形式化验证 |
| Acme | 通用架构互换格式 | 不同ADL之间的转换桥梁 | 架构互换描述、工具互操作 |
| UniCon | 基于组件和连接器 | 通用系统描述 | 组件、连接器、协议声明 |
| Rapide | 基于事件驱动 | 实时系统、事件驱动架构 | 事件模式匹配、因果约束 |
| SADL | 形式化语义,支持分析 | 需要形式化验证的系统 | Z语言注解、形式化规格说明 |
| AADL | SAE标准,嵌入式实时系统 | 航空、汽车等嵌入式领域 | 线程、进程、处理器绑定 |
| xADL | 可扩展,基于XML | Web环境、工具集成 | XML Schema、可扩展插件 |
定义:系统响应速度和处理能力。衡量指标:响应时间、吞吐率、延迟。
实现战术(Quality Tactics):
资源调度 负载均衡 并发处理 缓存 异步处理 资源池 数据压缩定义:正常运行时间比例和故障恢复能力。衡量指标:MTBF(平均无故障时间)、MTTR(平均恢复时间)。
可用性计算: Availability = MTBF / (MTBF + MTTR)
实现战术:
冗余部署 故障转移 健康检查 心跳检测 降级服务 熔断机制 数据备份定义:阻止非授权访问和抵御攻击的能力。衡量指标:非授权访问阻止率、攻击抵御率。
实现战术:
认证授权 加密传输(HTTPS) 防火墙 入侵检测 审计日志 输入验证 最小权限定义:系统进行变更所需的代价。衡量指标:变更的代价(成本、时间)。
实现战术:
松耦合 模块化 配置化 抽象接口 封装变化 语义一致性 依赖管理| 开发期 | 运行期 |
|---|---|
| 易理解性 | 性能 |
| 可扩展性 | 安全性 |
| 可重用性 | 可伸缩性 |
| 可测试性 | 互操作性 |
| 可维护性 | 可靠性 |
| 可移植性 | 可用性 |
| 鲁棒性 |
优先级确定方法:
| 冲突对 | 冲突描述 | 典型场景 |
|---|---|---|
| 性能 vs 安全性 | 加密解密增加延迟 | HTTPS比HTTP慢,但更安全 |
| 性能 vs 可用性 | 数据同步增加延迟 | 强一致性要求同步复制,影响响应速度 |
| 可用性 vs 一致性 | CAP定理的核心矛盾 | 分布式系统中,分区容错下只能选AP或CP |
| 可修改性 vs 性能 | 解耦引入中间层增加开销 | 微服务间通过消息队列通信,增加网络延迟 |
| 安全性 vs 可用性 | 安全措施可能成为瓶颈 | 过于严格的风控可能阻断正常请求 |
这四个概念是案例分析题的必考点,必须准确区分。
| 概念 | 定义 | 关键词 | 识别方法 |
|---|---|---|---|
| 风险点 | 潜在的、存在问题的架构决策带来的隐患 | 隐患、问题 | 找"可能出问题"的决策 |
| 非风险点 | 不会带来隐患的可接受决策 | 可接受、安全 | 找"合理、成熟"的决策 |
| 敏感点 | 实现某种特定质量属性,构件所具有的特性 | 单一质量属性 | 找只影响"一个"属性的构件特性 |
| 权衡点 | 影响多个质量属性的特性 | 多个质量属性 | 找同时影响"多个"属性的特性 |
题目问"识别风险点、敏感点、权衡点"时:
| 案例描述 | 分类 | 分析 |
|---|---|---|
| "系统只有一台应用服务器" | 风险点 | 单点故障,无法保证可用性 |
| "使用Spring Boot 3.x框架" | 非风险点 | 成熟框架,社区活跃,风险可控 |
| "主键采用自增ID" | 敏感点 | 影响数据库写入性能(单属性) |
| "读写分离 + 数据同步延迟100ms" | 权衡点 | 影响性能(读分离加速)+ 可用性(异步容灾)+ 一致性(延迟不一致) |
| "用户密码使用MD5加密" | 风险点 | MD5已被证明不安全,应使用bcrypt |
| "接口采用RESTful风格" | 非风险点 | 业界标准做法,成熟可靠 |
| "JVM堆内存设置为固定4G" | 敏感点 | 影响GC性能(单属性) |
| "采用消息队列解耦服务" | 权衡点 | 影响可修改性(解耦)+ 性能(异步提升)+ 可用性(削峰) |
| 方法 | 全称 | 侧重点 | 复杂度 | 发展关系 |
|---|---|---|---|---|
| SAAM | Software Architecture Analysis Method | 可修改性 | 低 | 最早的方法 |
| ATAM | Architecture Tradeoff Analysis Method | 多质量属性评价与折中 | 中 | 在SAAM基础上发展 |
| CBAM | Cost Benefit Analysis Method | 成本效益分析 | 高 | 在ATAM基础上增加成本 |
| 角色 | 人数 | 职责 |
|---|---|---|
| 评估小组负责人 | 1人 | 组织整个评估活动,负责报告撰写 |
| 评估小组/书记员 | 1-2人 | 记录评估过程中的关键信息 |
| 架构设计师 | 1-2人 | 描述和讲解架构,回答架构相关问题 |
| 风险承担者/干系人 | 5-10人 | 提供场景,参与评估讨论 |
| 阶段 | 步骤 | 内容 | 关键产出 |
|---|---|---|---|
| 第一阶段 场景和需求收集 |
① 收集场景 | 从干系人获取使用场景 | 场景列表 |
| ② 收集需求/约束/环境 | 明确系统约束条件 | 需求约束文档 | |
| 第二阶段 架构视图和场景实现 |
③ 描述架构视图 | 用4+1视图等描述架构 | 架构视图文档 |
| ④ 实现场景 | 将场景映射到架构上 | 场景-架构映射表 | |
| 第三阶段 属性模型构造和分析 |
⑤ 特定属性分析 | 构造质量属性模型 | 质量属性模型 |
| ⑥ 单一理论分析 | 评估单一质量属性 | 单属性评估结果 | |
| 第四阶段 折中 |
⑦ 标志敏感度 | 识别敏感点 | 敏感点列表 |
| ⑧ 标志折中 | 识别权衡点 | 权衡点列表 |
| 架构策略 | 性能改善 | 可用性改善 | 实施成本 | 综合效益 |
|---|---|---|---|---|
| 引入缓存 | 高 (+30) | 中 (+10) | 中 (¥10万) | 40/10 = 4.0 |
| 数据库分片 | 高 (+25) | 低 (+5) | 高 (¥30万) | 30/30 = 1.0 |
| 服务降级 | 中 (+10) | 高 (+25) | 低 (¥5万) | 35/5 = 7.0 ⭐ |
结论:服务降级方案性价比最高(7.0),优先实施。
| 方式 | 说明 | 优缺点 |
|---|---|---|
| 基于调查问卷 | 通过问卷收集干系人意见 | 优点:覆盖面广;缺点:主观性强 |
| 基于度量 | 通过量化指标评估 | 优点:客观精确;缺点:指标选取难 |
| 基于场景 ⭐ | 通过具体场景评估质量属性 | 优点:直观具体;缺点:场景选取需经验 |
场景 = 从风险承担者角度与系统交互的简短描述,是架构评估的基础分析单元。
| 要素 | 定义 | 示例 | 提问技巧 |
|---|---|---|---|
| 刺激源 | 生成刺激的实体 | 用户、外部系统、定时器 | "谁触发了这个事件?" |
| 刺激 | 在某些条件下发生的事件 | 请求、故障、攻击 | "发生了什么?" |
| 制品 | 被刺激的对象 | 整个系统或某个组件 | "影响的是哪个组件?" |
| 响应 | 刺激到达后采取的行动 | 处理请求、记录日志 | "系统做了什么?" |
| 响应度量 | 可度量的响应指标 | 响应时间、恢复时间 | "怎么衡量好坏?" |
| 环境 | 刺激发生时系统所处状态 | 正常操作、降级操作 | "当时系统在什么状态?" |
| 要素 | 内容 |
|---|---|
| 刺激源 | 终端用户 |
| 刺激 | 提交一个查询请求 |
| 环境 | 系统正常运行,并发用户1000 |
| 制品 | 订单查询服务 |
| 响应 | 从数据库检索并返回结果 |
| 响应度量 | 响应时间 ≤ 2秒 |
| 要素 | 内容 |
|---|---|
| 刺激源 | 系统内部(进程崩溃) |
| 刺激 | 服务进程异常终止 |
| 环境 | 正常运行状态 |
| 制品 | 订单处理服务 |
| 响应 | 检测事件 → 记录并通知 → 自动重启服务 |
| 响应度量 | 3分钟内恢复服务,数据不丢失 |
| 要素 | 内容 |
|---|---|
| 刺激源 | 外部攻击者 |
| 刺激 | 尝试SQL注入攻击 |
| 环境 | 系统在线运行 |
| 制品 | 用户认证服务 |
| 响应 | 检测攻击 → 阻止请求 → 记录日志并告警 |
| 响应度量 | 攻击拦截率 99.9% |