Day28-21|7.1.1 软件架构的定义
Day28-21|7.1.1 软件架构的定义:在复杂性中建立系统的高层结构与关键决策
本文对应《系统架构设计师教程(第2版)》第7章“系统架构设计基础知识”7.1.1“软件架构的定义”。软件架构是对系统整体结构、组成元素、元素之间关系以及指导其设计和演化的原则的描述。它不是一张部署图,也不是技术名词的堆砌,更不是某个框架的使用说明。架构通过高层决策约束系统的组织方式、交互方式、数据流、部署边界和质量属性,是把业务目标转化为可实施系统的重要桥梁。
一、学习目标与考试定位
完成本节后,应能够准确解释软件架构的定义、组成和边界;理解架构元素、连接件、配置、约束、原则和架构决策;区分软件架构、详细设计、部署架构和技术架构;能够说明架构为什么决定系统的质量属性和演进成本;能够识别架构风险、关键决策和权衡;能够在案例题和论文中用业务目标、质量场景和架构机制完整描述一个架构。
软考高级题目通常不会只问“软件架构是什么”,而是给出性能不足、系统难以扩展、模块互相调用、数据不一致或需求变化频繁等问题,让考生判断架构层面的原因和措施。回答时要从系统边界、职责分解、交互关系、数据组织、部署环境和质量属性展开,而不能只写“采用微服务、分层或云原生”。
二、软件架构的基本定义
软件架构可以看作系统的高层组织结构,以及构成系统的元素、元素之间的关系和指导设计的原则。它回答几个关键问题:系统由哪些主要部分组成;各部分分别承担什么职责;它们如何通信和协作;数据和控制流如何组织;系统部署在哪里;为了满足性能、可用性、安全和可维护性,必须做出哪些关键决策。
架构具有多个视角。逻辑视角关注功能和职责,开发视角关注模块、组件和代码组织,运行视角关注进程、线程、通信和并发,物理视角关注节点、网络和部署,数据视角关注数据所有权、流转和存储。单一图无法表达全部架构,架构描述应选择与问题相关的视图。
架构不是系统的全部细节。算法实现、字段命名和普通页面样式通常属于详细设计;但若算法决定吞吐和实时性、字段决定跨系统契约、页面决定安全边界,则可能上升为架构关注点。判断标准是:该决策是否影响多个模块、关键质量属性、系统生命周期成本或后续变更难度。
三、架构的组成要素
1. 架构元素
架构元素是系统中具有明确职责和边界的主要组成部分,如用户界面、订单服务、库存服务、消息平台、数据库、缓存、身份平台和外部支付系统。元素可以是模块、组件、服务、进程、节点或数据存储,具体粒度取决于架构视图。
一个合格的元素应有职责、输入、输出、约束、拥有者和生命周期。只在图上写“业务层”“中间件”“平台”而不说明职责和边界,无法支持设计和评审。
2. 连接件
连接件描述元素如何交互,例如同步调用、异步消息、事件、共享数据、文件交换、网络协议和人工流程。连接件不仅是“箭头”,还包含接口、数据格式、超时、重试、顺序、幂等、安全和错误处理。
同步调用简单直观,但会形成时间耦合和级联故障;异步消息提高解耦和削峰能力,却引入延迟、重复、乱序和最终一致性。连接方式本身就是架构决策,必须与质量场景相匹配。
3. 配置与约束
架构配置是元素和连接件按一定规则组成的整体;约束包括业务、技术、法规、组织、预算、性能、部署和兼容限制。例如必须使用既有身份平台、数据不能跨境、核心交易 RPO 接近零、应用需要兼容旧接口。架构不是在真空中设计,约束决定可行方案空间。
4. 架构原则与决策
原则提供长期方向,如职责单一、接口稳定、最小权限、可观测、自动化和渐进演进;决策是在具体约束下选择方案,如采用消息而非同步调用、使用关系数据库保存订单事实、以租户作为路由键。决策应记录背景、候选方案、权衡、后果和验证证据。
四、架构与功能、质量属性
功能需求说明系统要做什么,质量属性说明系统要以什么程度、在什么约束下完成。架构尤其决定跨模块的质量属性,因为性能、可用性、安全和可维护性通常不是单个类就能保证的。
| 质量属性 | 架构问题 | 可能的结构性措施 |
|---|---|---|
| 性能 | 请求路径、并发、数据访问和资源竞争 | 缓存、异步化、分区、分片、限流 |
| 可用性 | 故障边界、依赖和切换 | 冗余、隔离、熔断、降级、灾备 |
| 可靠性 | 状态、事务和失败恢复 | 幂等、重试、补偿、日志、校验 |
| 安全性 | 信任边界、身份和数据流 | 认证、授权、加密、隔离、审计 |
| 可维护性 | 模块耦合、变更传播和可观测 | 分层、接口、自动化、日志和指标 |
| 可扩展性 | 容量增长和功能演进 | 无状态、弹性、插件、版本兼容 |
质量属性之间存在权衡。强一致的跨节点事务可能牺牲可用性和延迟;更多服务拆分提高独立部署能力,却增加网络、运维和测试复杂度;更强隔离提升安全,可能增加资源和管理成本。架构决策应写明目标、代价和残余风险。
五、架构决策的特点
架构决策通常影响范围大、生命周期长、逆转成本高。选择服务边界、主数据所有权、消息语义、数据库模型、认证体系和部署平台后,后续代码、测试和运维都会围绕它展开。架构师要优先识别不可逆或高代价决策,尽早用原型、实验和评审验证。
架构决策还具有不确定性。需求、流量、技术成熟度和外部依赖可能变化,因此架构要通过模块化、适配器、版本化、配置外置、渐进迁移和可替换设计保留选择权。保留选择权不是无限抽象,而是对高风险变化设计可控边界。
架构决策记录(ADR)可以包含标题、状态、背景、问题、候选方案、决策、影响、验证、替代方案和日期。决策记录能防止团队反复争论,也能在出现问题时追溯假设和权衡。
六、架构边界与职责分解
良好的架构边界使变化局部化。边界可以围绕业务能力、数据所有权、质量属性、团队职责、部署和安全信任域划分。模块或服务之间通过明确接口协作,不应共享不可控的内部状态。
职责分解要避免两种极端:大而全的模块把所有逻辑集中,修改风险和协作冲突大;过度拆分产生大量网络调用、分布式事务和运维负担。合理的边界应具有高内聚、低耦合、明确数据责任和可独立验证能力。
共享数据库尤其容易破坏边界。多个服务直接写同一组表,任何模式和规则变化都会跨服务传播;如果必须共享,应明确读写权限、逻辑视图、所有者和变更流程,长期应评估数据服务或事件协同。
七、架构描述和视图
架构描述需要面向不同干系人。业务人员关心能力和流程,开发人员关心模块和接口,测试人员关心质量场景和可验证性,运维人员关心部署、监控、容量和恢复,安全人员关心信任边界、权限和审计。因此应采用多视图描述,而不是只提供一张复杂图。
常见视图包括上下文视图、逻辑视图、开发视图、运行视图、物理视图、数据视图和安全视图。每个视图要有目的、范围、元素定义、关系、假设和版本,视图之间的映射要保持一致。图形只是表达手段,文字、表格、接口契约和决策记录同样重要。
八、架构与生命周期
架构从需求、设计、实现、测试、部署到运行维护持续发挥作用。需求阶段识别质量场景和约束;设计阶段形成结构和决策;实现阶段验证边界和规则;测试阶段验证质量属性;部署阶段落实节点、网络和配置;运行阶段通过监控、故障和变更反馈架构改进。
架构不是一次性交付物。业务规模、技术平台、法规和组织会变化,架构需要演化。保留架构债务清单、质量指标、运行反馈、变更记录和演进路线,有助于避免系统在局部修补中逐渐失去整体结构。
九、架构风格、模式与技术实现的关系
架构风格描述系统组织的一类总体特征,如分层、管道—过滤器、事件驱动、客户机/服务器和数据中心型;架构模式是针对反复出现问题的可复用方案,如 MVC、微服务、发布—订阅和六边形架构;技术实现是使用具体框架、中间件、数据库和云服务落地。
三者不能混为一谈。采用微服务模式不等于已经完成服务边界、通信、一致性和运维设计;使用消息中间件不等于已经建立事件驱动架构;选择某云平台也不等于具备弹性和高可用。考试作答应从风格或模式继续说明元素如何划分、如何通信、数据如何管理、质量问题如何解决。
十、架构评估与验证
架构评估要围绕质量场景和风险,而不是评价图是否美观。可以采用场景走查、原型、性能压测、故障注入、安全评审、容量模型、威胁建模和恢复演练。评估结果包括风险、敏感点、权衡点和改进措施。
例如“单个支付节点故障后 30 秒内恢复,不能重复扣款”需要检查冗余、选主、幂等、日志、状态和切换;“流量增长十倍仍满足 P99 延迟”需要检查无状态、缓存、分片、下游容量和限流。架构评估的证据应能够支撑决策,而不是只写“经过评审可行”。
十一、案例分析:微服务拆分后系统更难维护
某企业把原有单体系统拆成二十多个微服务,采用统一消息平台和容器部署。上线后服务间调用链变长,订单、库存和支付数据不一致;团队发现多个服务共享订单表,任何字段变更都要同步发布;监控只能看到单服务日志,无法定位跨服务故障。项目负责人认为问题是“服务数量还不够多”。
问题分析
该方案把技术实现当成架构设计,缺少按业务能力和数据所有权划分边界;共享数据库破坏服务自治;同步调用和消息没有明确超时、幂等、重试和一致性;缺少端到端追踪、质量场景和故障验证。增加服务数量不能解决边界、连接和可观测问题。
改进方案
重新识别订单、库存和支付的业务责任和事务边界,建立服务契约和数据所有权,限制跨服务直接写表;对核心流程采用本地事务加事件、状态机、幂等、补偿和对账,明确同步与异步的选择;优化调用链、超时、熔断、限流和重试,建立追踪号、集中日志、指标和告警;通过容量、故障、数据一致性和恢复测试验证。对不需要独立部署的细粒度服务适当合并,降低网络和运维复杂度。
十二、综合知识练习与详细答案
练习一
请解释软件架构与详细设计的区别。
参考答案:软件架构关注系统的高层结构、主要元素、交互关系、数据和部署边界、关键原则及对质量属性有重大影响的决策;详细设计关注模块内部类、算法、数据结构和具体实现。二者没有绝对界线,若某个算法、数据结构或接口决策影响多个模块、性能、安全或长期演进,就应纳入架构关注和评审。
练习二
某团队说“采用事件驱动架构后,系统天然高可用且最终一致”。请评价。
参考答案:该说法不成立。事件驱动可以降低时间耦合、削峰和解耦,但仍需设计消息持久化、投递语义、重复、乱序、积压、消费者故障、幂等、重试、死信和补偿;高可用还依赖节点、存储、网络、切换和恢复;最终一致要定义收敛、延迟、冲突和对账。采用模式只是起点,不能替代架构机制和验证。
练习三
架构评审中发现一个方案性能很好,但数据安全和灾备不足,如何处理?
参考答案:不能只因性能好就接受。应将安全、可用性和恢复场景量化,识别信任边界、权限、加密、审计、备份、RTO/RPO和切换要求;提出加密、隔离、最小权限、脱敏、冗余、备份和恢复演练等措施,重新评估性能和成本权衡;若仍有残余风险,由有权限责任人明确接受并记录,形成可追溯决策。
十三、论文写作素材
论文中可以这样定义和展开架构:我将软件架构视为系统主要元素、连接件、配置、约束和指导原则的集合,先从业务目标、系统边界、质量属性和外部约束出发,识别订单、库存、支付、用户、消息、数据库和外部平台等核心元素,明确职责、数据所有权、接口、部署和生命周期。
针对性能、可用性、安全、可靠性和可维护性质量场景,我选择同步调用、异步事件、缓存、冗余、限流、幂等、补偿、审计和可观测等机制,并记录候选方案、权衡、代价和残余风险。使用逻辑、开发、运行、物理、数据和安全视图向不同干系人说明架构,保持视图之间的一致性。
架构实施后通过原型、容量压测、故障注入、安全评审、数据对账和灾备演练验证关键决策;将架构决策、接口契约、配置、质量指标和风险纳入配置管理。运行中根据延迟、错误、资源、故障和变更反馈持续演进,避免把微服务、消息或云平台等技术名词当成架构本身。
十四、今日复盘
软件架构是系统高层结构、组成元素、元素关系以及指导设计和演化原则的综合描述。元素承担职责,连接件定义协作,配置体现组织,约束限定方案,原则和决策指导长期演进。架构尤其影响跨模块质量属性和变更成本,因此必须从业务目标、质量场景、数据边界、部署、风险和验证证据出发。
记忆主线:
架构看整体,元素有职责,连接件有语义,约束定边界,决策有权衡,视图要一致,质量要验证,系统要演进。
下一篇进入 7.1.2 软件架构设计与生命周期,学习架构活动在需求、设计、实现、测试、部署和维护阶段的作用。