Day01-01|1.1.1 系统架构的定义及发展历程
Day01-01|1.1.1 系统架构的定义及发展历程
教材版本:系统架构设计师教程(第 2 版)
教材章节:第 1 章 绪论 1.1.1
考试科目:综合知识、案例分析、论文
建议用时:120~150 分钟
一、学习目标
完成本节后,你应该能够:
- 用自己的话解释系统架构、软件架构和系统架构设计;
- 区分架构、详细设计、技术栈和部署方案;
- 理解架构从单体、分层、分布式到云原生演化的主要原因;
- 从业务规模、质量属性和约束条件分析架构演化;
- 在综合知识、案例题和论文中准确使用“结构、行为、视图、决策、权衡”等关键词。
二、为什么要先学“架构定义”
系统架构设计师的考试并不是技术产品记忆考试。题目可能出现数据库、网络、云平台、消息中间件、微服务、嵌入式系统或安全架构,但这些内容背后都在考同一个问题:如何在需求和约束下组织系统,使系统达到预期质量。
如果没有架构概念,学习者很容易把“使用某个框架”当成架构,把“画了一张模块图”当成设计,把“系统能运行”当成质量合格。第 1.1.1 节要建立的基础认识是:架构描述的是系统中具有全局影响的结构、关系、行为和决策。
三、系统架构的基本含义
系统架构可以理解为系统的总体组织方式。它回答系统由哪些部分组成、这些部分如何协作、数据和控制如何流动、系统如何部署,以及系统如何满足性能、可用性、安全性和可维护性等要求。
软件架构通常包含四个基本要素:
| 要素 | 含义 | 例子 |
|---|---|---|
| 构件 | 承担相对独立职责的组成单元 | 用户服务、订单服务、数据库 |
| 连接件 | 支持构件交互的机制 | API、消息队列、共享文件、数据库连接 |
| 配置 | 构件与连接件的组织关系 | 分层、发布订阅、主从复制 |
| 约束 | 对结构和交互的限制 | 只能依赖下层、必须加密、不能共享数据库 |
构件不是越细越好。拆成几十个服务不一定比三个清晰模块更优秀;连接件也不是越先进越好,同步调用、异步消息、文件交换各有适用边界;约束是架构的重要组成部分,没有约束就没有可验证的结构规则。
四、架构与详细设计的区别
架构关注会影响系统整体的决策,详细设计关注局部实现。比如“订单服务与库存服务通过事件通信”属于架构决策,因为它会影响一致性、故障处理、监控和部署;“订单对象使用哪个字段保存备注”通常属于详细设计。
但架构和详细设计不是完全隔离的。一个看似局部的选择,如果会影响多个模块,就可能上升为架构问题。例如统一异常格式、全局身份认证、主数据编码、日志追踪标识和事务边界,虽然可以在代码中实现,却会影响整个系统的协作方式。
判断一个问题是否属于架构问题,可以问三个问题:是否影响多个组件?是否影响关键质量属性?后期修改是否会造成较大范围返工?如果答案为“是”,就应在架构层面记录和评审。
五、架构是结构,也是行为
静态结构描述系统有哪些模块、层、节点和数据存储;动态行为描述请求如何流动、组件如何调用、消息如何传递、故障如何传播和系统如何恢复。只画静态结构而不说明运行行为,无法回答高并发、超时、重试和故障切换问题。
以支付系统为例,静态结构可以包括订单服务、支付服务、账户系统和消息系统;动态行为则要说明用户提交订单后如何创建待支付状态,支付请求超时如何处理,第三方回调乱序如何校验,重复回调如何幂等,最终状态如何对账修复。
因此,架构说明至少需要包含:
- 逻辑视图:职责和模块如何划分;
- 开发视图:代码、组件和团队如何组织;
- 运行视图:进程、线程、并发和通信如何发生;
- 部署视图:服务部署在哪些节点和网络区域;
- 场景视图:关键用例如何穿过各个组件并验证设计。
六、架构发展历程
架构演化不是简单的技术潮流替换,而是业务规模、质量要求、组织方式和基础设施变化共同作用的结果。
1. 单体和主程序/子程序
早期系统常把功能集中在一个程序中,由主程序调用多个子程序。优点是调用简单、事务边界清晰、部署容易;缺点是模块之间容易形成隐式依赖,修改和发布影响范围大,难以独立扩容。
2. 分层架构
分层架构按职责组织系统,例如表示层、业务层、数据访问层和基础设施层。它通过依赖方向和接口约束降低复杂度,适合业务规则较稳定的企业应用。问题在于层次过多会增加调用链,边界不清会造成业务逻辑泄漏。
3. 客户机/服务器和分布式架构
当终端数量增加、数据需要集中管理时,系统将交互和服务拆到客户端与服务器。进一步地,计算、存储和网络资源分布在多个节点,形成分布式架构。分布式架构带来扩展能力和资源共享,也引入网络延迟、部分失败、时钟差异、数据一致性和运维复杂度。
4. 面向服务和微服务
面向服务强调把业务能力封装为可复用服务,通过标准契约进行协作。微服务进一步强调独立部署、独立扩展和围绕业务边界拆分。它们能够降低组织和发布耦合,但也会引入服务治理、调用链、数据一致性、配置管理和故障定位问题。
5. 云原生和弹性架构
云原生架构利用容器、自动化编排、服务治理、弹性伸缩、可观测性和持续交付,适应动态资源环境。它解决的是资源利用、交付速度、弹性和运维自动化问题,并不意味着所有系统都必须拆成微服务。单体应用也可以容器化和云化,架构选择仍要结合场景。
七、架构演化背后的驱动力
| 驱动力 | 典型表现 | 架构影响 |
|---|---|---|
| 业务规模扩大 | 用户、订单和数据增长 | 扩容、分片、缓存、异步化 |
| 业务变化加快 | 新渠道、新规则频繁出现 | 模块化、插件化、接口隔离 |
| 可用性要求提高 | 不能单点中断 | 冗余、故障转移、降级、灾备 |
| 组织规模扩大 | 多团队并行开发 | 服务边界、契约、版本治理 |
| 合规安全增强 | 审计、隐私和数据分级 | 身份、授权、加密、审计 |
| 基础设施变化 | 云、容器和边缘节点 | 自动部署、弹性和可观测性 |
架构演化的关键是识别真正的驱动力。例如,业务团队多不一定必须微服务,只有当独立交付、独立扩展和边界自治的收益大于分布式成本时,拆分才有意义。
八、综合知识易错点
第一,架构不是产品名词的集合。Redis、Kafka、Kubernetes 只是实现工具,必须说明它们服务于哪个架构决策和质量属性。第二,分布式不等于高可用。多个节点如果共享同一个单点数据库,仍然可能整体不可用。第三,微服务不等于低耦合。若服务共享数据库、接口互相嵌套调用,耦合可能比单体更严重。第四,云原生不等于上云。云原生还涉及自动化、弹性、可观测性、持续交付和面向失败设计。
九、案例分析题
某连锁零售企业原有单体系统,部署在一台服务器上。随着门店和用户增加,促销期间出现响应变慢;新接入一个支付渠道需要修改多个模块;系统发生故障时无法快速定位。企业希望逐步改造,但不能一次性重写全部代码。
请回答:
- 该系统当前面临哪些架构问题?
- 应如何确定改造优先级?
- 是否应该直接改造成微服务?请说明理由。
- 给出一个渐进式架构演化方案。
参考答案
当前问题包括部署单点和可用性不足;高峰期缺少容量和弹性设计;支付渠道与核心业务耦合,导致可修改性差;缺少统一监控和链路追踪,故障定位困难。
改造优先级应先处理高风险、影响面大且可以验证的问题,例如增加监控和容量基线,再隔离支付渠道和高频查询,最后根据团队能力和业务边界决定是否服务化。不能直接以“微服务”作为目标,因为一次性拆分会引入网络调用、分布式事务、部署治理和数据迁移风险。
渐进方案可以是:先建立统一日志、指标、链路追踪和健康检查;对商品查询增加缓存和读扩展;通过适配器隔离支付渠道;将非核心通知改为可靠事件;在边界稳定后再把支付或库存等模块独立部署;每一步通过性能、故障和回归测试验证,再逐步迁移流量。这样既改善质量属性,也控制重构风险。
十、综合知识练习
- 软件架构的基本要素包括哪些?
- 为什么架构既要描述静态结构,又要描述动态行为?
- 分层架构解决什么问题?它的主要代价是什么?
- 分布式架构新增了哪些问题?
- 为什么不能看到微服务和云原生就直接套用?
答案:1. 构件、连接件、配置和约束。2. 静态结构说明系统组成,动态行为说明调用、消息、故障和恢复,二者共同决定系统实际质量。3. 分层通过职责和依赖控制降低复杂度,代价是调用链变长和层次泄漏风险。4. 网络延迟、部分失败、一致性、时钟、数据分布和运维治理。5. 架构必须由业务目标、质量属性、约束和团队能力驱动。
十一、论文素材
本节适合积累“单体系统渐进式架构演化”主题。论文结构可以这样写:项目初期采用单体和分层架构,随着业务规模、发布频率和团队数量增长,出现性能、可修改性和故障定位问题;通过监控治理、缓存优化、接口适配、事件解耦和边界服务化逐步演进;改造过程中权衡了实时一致性与异步吞吐、拆分收益与运维成本;最终用响应时间、发布周期、故障恢复时间和错误率说明效果。
不要把“架构升级”写成技术堆砌。论文必须回答为什么改、改了什么、如何验证、有哪些代价,以及后续还要如何演化。
十二、今日复盘
请闭卷回答:
- 什么是系统架构?
- 构件、连接件、配置和约束分别是什么?
- 架构和详细设计如何区分?
- 为什么分布式架构会增加复杂度?
- 架构演化的真正驱动力是什么?
如果你能结合一个实际系统回答,而不是只背定义,本节才算完成。