软件体系结构
00:00
软件体系结构:架构风格、质量属性、架构评估与文档化
1. 软件体系结构概述
1.1 定义
软件体系结构是系统的组织结构,包括软件组件、组件间的关系以及指导系统设计和演化的原则。
1.2 架构与设计
| 层面 | 关注点 | 决策范围 |
|---|---|---|
| 架构 | 全局结构、质量属性 | 系统级 |
| 设计 | 局部结构、实现细节 | 模块级 |
2. 架构风格
2.1 数据流风格
管道-过滤器:
数据源 → 过滤器1 → 过滤器2 → 过滤器3 → 数据汇
特点:数据驱动,松耦合,可重用。示例:Unix 管道、ETL。
批处理:
输入文件 → 处理步骤1 → 处理步骤2 → 输出文件
特点:步骤间完全解耦,延迟高。
2.2 调用/返回风格
主程序-子程序:传统结构化设计。
面向对象:封装、继承、多态。
层次结构:
表示层 → 业务层 → 持久层 → 数据库
特点:每层只依赖下层,可替换层实现。
2.3 独立组件风格
进程通信:独立进程通过消息传递协作。
事件驱动:
事件源 → 事件总线 → 事件处理器1
→ 事件处理器2
特点:松耦合,可扩展,但流程不直观。
2.4 仓库风格
数据库系统:共享数据为中心。
黑板系统:
知识源1 ──→ 黑板 ←── 知识源2
↕
控制器
特点:适用于不确定求解策略的问题(如语音识别)。
2.5 现代架构风格
微服务:
- 每个服务独立部署
- 通过 API 通信
- 去中心化数据管理
事件溯源:
- 所有状态变更以事件形式存储
- 当前状态通过重放事件计算
- 天然审计日志
CQRS:
- 命令(写)和查询(读)分离
- 可独立优化读写性能
六边形架构(端口与适配器):
外部系统 ←→ 适配器 ←→ 端口 ←→ 应用核心 ←→ 端口 ←→ 适配器 ←→ 数据库
核心业务逻辑不依赖任何外部技术。
3. 质量属性
3.1 运行时质量属性
| 属性 | 定义 | 策略 |
|---|---|---|
| 性能 | 响应时间、吞吐量 | 缓存、并发、负载均衡 |
| 可用性 | 系统正常运行时间 | 冗余、故障转移、心跳 |
| 安全性 | 抵御攻击的能力 | 认证、授权、加密 |
| 易用性 | 用户完成任务的能力 | 一致性、反馈、撤销 |
3.2 开发时质量属性
| 属性 | 定义 | 策略 |
|---|---|---|
| 可修改性 | 修改的难易程度 | 模块化、信息隐藏 |
| 可测试性 | 验证正确性的难易 | 可观察性、可控性 |
| 可移植性 | 跨平台运行的能力 | 抽象层、标准接口 |
| 可重用性 | 在其他系统使用的可能性 | 通用接口、配置化 |
3.3 质量属性场景
描述质量需求的标准化方式:
刺激源 → 刺激 → 环境 → 制品 → 响应 → 响应度量
示例(性能):
用户 → 请求 → 正常负载 → 系统 → 响应 → < 200ms
4. 架构评估
4.1 ATAM 方法
架构权衡分析方法(Architecture Tradeoff Analysis Method):
- 介绍 ATAM
- 介绍业务驱动
- 介绍架构
- 识别架构方法
- 生成质量属性效用树
- 分析架构方法
- 头脑风暴和优先级排序场景
- 分析架构方法
- 报告结果
4.2 效用树
效用
├── 性能
│ ├── 场景P1: 峰值负载响应时间 < 500ms (高)
│ └── 场景P2: 平均响应时间 < 100ms (中)
├── 可用性
│ ├── 场景A1: 单节点故障不影响服务 (高)
│ └── 场景A2: 数据零丢失 (高)
├── 可修改性
│ └── 场景M1: 新增支付方式 < 2人周 (中)
└── 安全性
└── 场景S1: 抵御SQL注入 (高)
4.3 权衡点与敏感点
敏感点:影响某个质量属性的关键架构决策。
权衡点:影响多个质量属性的架构决策(可能互相矛盾)。
示例:加密强度 ↑ → 安全性 ↑ 但 性能 ↓
5. 架构文档化
5.1 视图类型
| 视图 | 关注点 | 受众 |
|---|---|---|
| 模块视图 | 代码组织 | 开发者 |
| 组件-连接器视图 | 运行时结构 | 架构师 |
| 分配视图 | 软件到硬件的映射 | 运维 |
5.2 4+1 视图模型
逻辑视图(功能需求)
开发视图(程序员视角)
进程视图(并发/同步) ← 场景 →
物理视图(部署视角)
5.3 C4 模型
| 层级 | 名称 | 范围 | 受众 |
|---|---|---|---|
| Level 1 | 系统上下文 | 整个系统 | 所有人 |
| Level 2 | 容器 | 应用/数据存储 | 开发者 |
| Level 3 | 组件 | 模块/服务 | 开发者 |
| Level 4 | 代码 | 类/函数 | 开发者 |
6. 架构模式与反模式
6.1 常见反模式
| 反模式 | 问题 | 解决方案 |
|---|---|---|
| 大泥球 | 无架构,代码混乱 | 逐步重构 |
| 上帝对象 | 一个类做所有事 | 职责分离 |
| 金锤 | 过度使用某技术 | 评估替代方案 |
| 复制粘贴编程 | 重复代码 | 抽象和复用 |
| 架构黑洞 | 架构文档与实现不符 | 持续验证 |
6.2 康威定律
“设计系统的组织,其产生的设计等同于组织的沟通结构。”
逆康威实验:通过调整团队结构来驱动期望的架构。