背书答案

UML

依赖:A - - - - > B 关联:A ─────> B 聚合:A ◇──── B 组合:A ◆──── B 泛化:A ─────▷ B 实现:A - - - -▷ B

Object-Oriented Design Principles

  • 单一职责原则 SRP:一个类只负责一个功能领域中的相应职责,一个类不应该承担太多变化原因
  • 开闭原则 OCP:软件实体应当对扩展开放、对修改关闭,即尽量在不修改原有代码的基础上扩展系统行为
  • 里氏代换原则 LSP:所有引用基类对象的地方都应该能够透明地使用其子类对象,子类替换父类后系统行为不应被破坏
  • 依赖倒转原则 DIP:抽象不应该依赖于细节,细节应该依赖于抽象,要针对接口编程,不要针对实现编程
  • 接口隔离原则 ISP:客户端不应该依赖它不需要的接口,应把大接口拆成更小、更专门的接口
  • 合成复用原则 CRP:复用时优先使用对象组合 / 聚合,而不是继承;组合是黑盒复用,继承是白盒复用
  • 迪米特法则 LoD:一个软件实体应尽可能少地与其他实体发生相互作用,如果两个类不必直接通信,就通过第三者间接交互

目标是开闭原则;指导原则是迪米特法则;基础是单一职责原则和可变性封装原则;实现手段包括依赖倒转原则、合成复用原则、里氏代换原则和接口隔离原则

Design Pattern

设计模式是一套被反复使用、多数人知晓、经过分类编目的代码设计经验总结。它用于提高代码复用性、可理解性和可靠性。一个设计模式通常包括模式名称、问题、解决方案和效果。按目的可分为创建型、结构型和行为型;按范围可分为类模式和对象模式

Simple Factory Pattern

简单工厂模式定义一个专门的工厂类,根据传入参数创建不同具体产品对象。它的核心角色包括 Factory、Product、ConcreteProduct。客户端只需要知道参数,不需要知道具体产品类名和创建细节。优点是分离对象创建和业务处理,客户端使用简单;缺点是工厂类职责过重,新增产品通常要修改工厂判断逻辑,违背开闭原则。简单工厂不是 GoF 23 种设计模式之一

简单工厂模式类图

Factory Method Pattern

工厂方法模式定义创建产品对象的工厂接口,把具体实例化延迟到工厂子类。它的核心角色包括 Product、ConcreteProduct、Factory、ConcreteFactory。一个具体工厂通常对应一种具体产品;新增产品时新增具体产品和具体工厂。优点是符合开闭原则,隐藏具体产品创建细节;缺点是类数量增加,抽象层增加理解难度。工厂方法针对一个产品等级结构

工厂方法模式类图

Abstract Factory Pattern

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定具体类。它的核心角色包括 AbstractFactory、ConcreteFactory、AbstractProduct、ConcreteProduct。抽象工厂面向产品族,一个具体工厂负责创建同一产品族中的多个产品。优点是隔离具体类生成、方便更换产品族、保证客户端使用同一产品族对象;缺点是新增产品族容易,新增产品等级结构困难,这叫开闭原则的倾斜性

抽象工厂模式类图

抽象工厂产品族示意图

Builder Pattern

建造者模式将复杂对象的构建过程与表示分离,使同样的构建过程可以创建不同表示。它的核心角色包括 Builder、ConcreteBuilder、Director、Product。Director 控制构建顺序,Builder 负责逐步创建产品部件,客户端不需要关心内部组装细节。优点是产品和创建过程解耦,可精细控制创建过程;缺点是产品差异很大时不适合,内部变化复杂时具体建造者会很多。建造者返回一个组装好的完整产品

建造者模式类图

Prototype Pattern

原型模式用原型实例指定创建对象的种类,并通过复制原型创建新对象。它的核心角色包括 Prototype、ConcretePrototype、Client。适用于创建对象成本大、对象状态组合少、需要复制粘贴或保存状态的情况。优点是简化对象创建、提高创建效率、可动态增减原型对象;缺点是每个类需要实现克隆方法,深克隆实现复杂。浅克隆只复制对象本身,内部引用对象仍共享;深克隆会复制内部引用对象

原型模式类图

Adapter Pattern

适配器模式将一个接口转换成客户端期望的另一个接口,使接口不兼容的类可以协同工作。它的核心角色包括 Target、Adapter、Adaptee、Client。适配器把客户端请求转换成对适配者方法的调用,改变的是对外接口,不是原有类本身。类适配器使用继承,对象适配器使用组合;对象适配器通常更灵活。它适用于复用已有类但接口不符合系统需要的情况

对象适配器类图

类适配器类图

Composite Pattern

组合模式将对象组合成树形结构表示整体-部分层次,使客户端一致处理单个对象和组合对象。它的核心角色包括 Component、Leaf、Composite、Client。Composite 可以包含 Leaf,也可以包含其他 Composite,形成递归结构。适用于文件目录、XML、GUI 组件等树形结构。透明组合把 add/remove/getChild 放在 Component 中,强调一致性;安全组合只放在 Composite 中,强调类型安全

组合模式类图

Bridge Pattern

桥接模式将抽象部分与实现部分分离,使二者可以独立变化。它的核心角色包括 Abstraction、RefinedAbstraction、Implementor、ConcreteImplementor。桥接模式把继承关系转换为关联关系,用组合 / 聚合替代多层继承。它适用于存在两个独立变化维度、可能产生类爆炸、不希望抽象和实现静态绑定的场景。桥接通常用于系统初步设计;适配器常用于已有系统接口不兼容后的补救

桥接模式类图

Decorator Pattern

装饰模式动态地给一个对象增加额外职责,提供比继承更灵活的功能扩展方式。它的核心角色包括 Component、ConcreteComponent、Decorator、ConcreteDecorator。装饰者和被装饰者实现同一接口,装饰者内部持有 Component 引用,并在调用前后添加行为。它适用于动态增加或撤销功能、功能组合很多、不想用继承扩展对象的场景。装饰模式扩展对象职责;代理模式控制对象访问;适配器模式转换接口

装饰模式类图

Facade Pattern

外观模式为子系统中的一组接口提供统一的高层接口,使子系统更容易使用。它的核心角色包括 Facade、SubSystem、Client。客户端只与外观对象交互,复杂子系统调用由外观统一处理。优点是屏蔽子系统复杂性、降低耦合、体现迪米特法则;缺点是不能完全限制客户端直接访问子系统,没有抽象外观时增加新子系统可能违背开闭原则。外观模式负责简化访问,不负责给子系统增加新行为

外观模式类图

Flyweight Pattern

享元模式运用共享技术有效支持大量细粒度对象的复用。它的核心角色包括 Flyweight、ConcreteFlyweight、UnsharedConcreteFlyweight、FlyweightFactory。享元模式共享内部状态 intrinsic state,外部状态 extrinsic state 由客户端保存并传入。适用于大量相同或相似对象、内存消耗大、对象大部分状态可外部化的场景。优点是减少内存中对象数量,缺点是必须区分内部状态和外部状态,系统逻辑更复杂

享元模式类图

Proxy Pattern

代理模式为某个对象提供代理,并由代理对象控制对真实对象的访问。它的核心角色包括 Subject、Proxy、RealSubject、Client。代理和真实对象实现同一接口,代理内部持有真实对象引用,并在访问前后执行额外操作。常见类型包括远程代理、虚拟代理、保护代理、缓存代理。它适用于远程访问、延迟加载、权限控制、缓存、防火墙、智能引用等场景

代理模式类图

Strategy

策略模式定义一族算法,分别封装每个算法,并使它们可以相互替换。它的核心角色包括 Context、Strategy、ConcreteStrategy。Context 通过组合持有策略对象,算法可以独立于客户端变化。适用于一组算法、行为可替换、大量 if-else/switch、运行时切换行为的场景。优点是封装变化、替代继承、消除条件语句、符合开闭原则;缺点是客户端需要知道不同策略,策略类数量增加

策略模式类图

State

状态模式允许对象在内部状态改变时改变其行为,对象看起来像修改了它的类。它的核心角色包括 Context、State、ConcreteState。状态模式把不同状态下的行为和转换规则封装到不同状态类中。适用于对象行为依赖状态、状态经常切换、大量与状态有关的条件语句的场景。状态模式关注同一对象不同状态下行为不同;策略模式关注算法族可替换

状态模式类图

Command

命令模式将一个请求封装为对象,使请求发送者和接收者解耦。它的核心角色包括 Command、ConcreteCommand、Invoker、Receiver、Client。命令对象可以被存储、传递、排队、记录日志,并支持撤销 / 重做。它适用于命令队列、日志、Undo/Redo、宏命令等场景。宏命令是命令模式和组合模式联用

命令模式类图

Observer

观察者模式定义对象间一对多依赖关系,使一个对象状态变化时,所有依赖对象得到通知并自动更新。它的核心角色包括 Subject、ConcreteSubject、Observer、ConcreteObserver。Subject 维护观察者列表,通过 attach/detach/notify 注册、移除和通知观察者。适用于状态变化通知多个对象、发布-订阅、事件监听、Model 改变 View 自动更新等场景

观察者模式类图

Mediator

中介者模式用一个中介对象封装一系列对象交互,避免对象之间显式相互引用。它的核心角色包括 Mediator、ConcreteMediator、Colleague、ConcreteColleague。它把多对多复杂交互改成同事对象与中介者之间的一对多关系。优点是简化对象交互、同事类解耦;缺点是具体中介者可能过于复杂。中介者模式体现迪米特法则,MVC 中的 Controller 常可理解为中介者

中介者模式类图

Template

模板方法模式在父类中定义算法骨架,把某些步骤延迟到子类实现。它的核心角色包括 AbstractClass、ConcreteClass。模板方法负责组织整体流程,基本方法表示算法步骤,钩子方法提供可选扩展点。适用于算法流程固定、部分步骤变化、公共行为提取到父类、框架控制子类扩展的场景。它体现好莱坞原则:Don’t call us, we’ll call you

模板方法模式类图

质量属性场景

Availability

Interoperability

Modifiability

Performance

Security

Testability

Usability

质量属性 刺激源 刺激 工件 环境 响应 响应度量 对应 tactic / 设计理由
Availability Heartbeat 监视器 服务器无响应 进程 正常操作 通知操作者,并继续运行 没有停机时间 heartbeat 用于 detect faults;process monitor / failover 用于自动恢复或继续服务
Interoperability 本车车辆信息系统 发送当前位置 路况监控系统 系统在运行前已知 路况监控系统将当前位置与其他信息结合,叠加到 Google Maps 上,并进行广播 我们的信息在 99.9% 的时间被正确包含 discovery service 用于 locate;orchestrate / tailor interface 用于管理多个系统接口和响应处理
Modifiability 开发者 希望修改 UI 代码 设计时 修改完成并进行单元测试 在 3 小时内完成 encapsulate / use an intermediary 降低 UI 与业务逻辑耦合;defer binding 让 UI 变化更局部
Performance 用户 发起事务 系统 正常操作 事务被处理 平均延迟为 2 秒 prioritize events / reduce overhead 控制资源需求;introduce concurrency / caching 管理资源
Security 来自远程地点、心怀不满的员工 尝试修改薪酬标准 系统内数据 正常操作 系统维护审计追踪 正确数据在 1 天内恢复,并识别篡改来源 authenticate / authorize actors 控制访问;verify message integrity / audit log 追踪篡改
Testability 单元测试者 代码单元完成 代码单元 开发时 结果被捕获 3 小时内达到 85% 的路径覆盖 specialized interfaces 控制和观察状态;record/playback 记录测试过程和结果
Usability 用户 下载新应用 系统 运行时 用户高效地使用应用 经过 2 分钟试用 / 探索即可达到 maintain task model / user model 提供引导;cancel、undo、feedback 降低误操作成本

Architecture vs Design vs Structure

Architecture 和 design 的关系:

  • Architecture 是 software design 的一部分
  • architecture 关注的是 high-level design,是一组对系统整体结构和关键质量属性有重要影响的 design decisions

Architecture 和 structure 的关系:

  • Structure 更强调把系统分解为 components、modules、subsystems
  • Architecture 包含 structure / organization,但比简单分解更进一步:它定义 component interfaces,即组件能做什么;定义 component communications and dependencies,即组件如何通信、如何依赖;还定义 component responsibilities,即当请求某个组件时,它具体应该完成什么

What Does a Software Architect Do

英文 中文 解释
liaison 沟通协调 / 联络 在客户、技术团队和业务 / 需求分析人员之间;与管理层或市场人员之间
software engineering 软件工程 软件工程最佳实践
technical knowledge 技术知识 对技术领域的深入理解
risk management 风险管理 与设计、技术选择相关的风险;以及其他风险

速记:架构师 = 对外联络,对内按工程做,用技术判断,管架构风险

Where Do Architectures Come From

英文 中文 对架构的影响
NFRs 非功能需求 描述系统“做得多好”,如性能、可用性、安全性、易用性,通常直接驱动架构决策
ASRs 架构显著需求 对架构有重大影响的需求,是架构设计最直接的驱动因素
QRs 质量需求 / 质量属性需求 具体化质量属性要求,常用质量属性场景表达
stakeholders 利益相关者 提供业务目标、关注点、约束和质量属性优先级
organizations 组织因素 团队结构、开发流程、预算、进度、治理方式会限制或塑造架构
technical environments 技术环境 平台、框架、基础设施、已有系统、部署环境和技术约束会影响架构选择

速背

  • 需求类:NFRs、ASRs、QRs
  • 人:stakeholders
  • 组织:organizations
  • 技术环境:technical environments

Generic Design Strategy

策略 含义 架构例子
Decomposition 拆分复杂系统 电商拆成用户、订单、库存、支付服务
Abstraction 忽略细节,保留关键接口 用 Repository 接口隐藏数据库
Stepwise: Divide and Conquer 分而治之 编译器拆成词法、语法、语义、代码生成
Generate and Test 生成候选方案并分析 比较 active redundancy 和 passive redundancy
Iteration :Incremental Refinement 多轮迭代细化 ADD 每轮处理一组 drivers
Reusable Elements 复用已有模式、框架、组件 使用 MVC、Spring、消息队列

记忆:用一个电商系统串起来记

  • Decomposition 先把电商系统拆成:用户、商品、订单、库存、支付、物流
  • Abstraction 不让订单模块直接知道数据库细节,而是通过:OrderRepository 接口访问数据
  • **Stepwise / Divide and Conquer **下单流程太复杂,就分步处理:创建订单 → 锁库存 → 支付 → 发货 → 通知
  • Generate and Test 为了提高可用性,提出多个方案,再分析比较
  • Iteration / Incremental Refinement 第一轮先设计订单主流程,第二轮补异常处理,第三轮优化性能:
  • **Reusable Elements **不要自己从零写所有东西,复用:MVC、Spring Boot、Redis、Kafka、OAuth、设计模式
策略 在 ADD 中如何体现
Decomposition Step 3 选择元素并逐步分解
Abstraction 用模块、组件、接口抽象隐藏细节
Divide and Conquer Step 2 每次选择一组 drivers,拆成可处理的子问题
Generate and Test 设计决策是 hypothesis,Step 7 分析并修正
Iteration ADD 通过多轮迭代逐步完善架构
Reuse Step 4 使用参考架构、模式、战术、框架

对应往年题:

  • 2017/2019/2022:What are generic design strategies applied in designing software? Give a concise working example with software architecture for each strategy.

ASR 来源与识别方法

来源 / 方法 中文解释 答题关键词
Requirement documents 从需求文档中识别影响架构的功能、质量属性和约束 文档通常不够精确,需要澄清
QA Workshop / interviews 通过 Quality Attribute Workshop 或访谈利益相关者识别 ASR 业务目标、场景头脑风暴、优先级排序
Business goals 从业务目标反推关键质量属性 上线速度、成本、市场、合规
Utility tree 把 utility 分解为质量属性、子属性、具体场景,并按 Importance vs Difficulty 排序 ranked scenarios
Persona-Based approach/ ASP 用有架构意识的人物画像识别不同用户背后的架构关注点 安全、性能、可修改

Software requirements、quality attributes、ASRs 的区别和联系

  • 软件需求包括功能需求和⾮功能需求(⼜称质量需求)

  • 质量属性是由软件的业务⽬标所决定,在功能需求的基础上提供的整个系统的合乎需求的特性,是⾮功能需求的⼀种体现

  • ASRs架构攸关需求是对于体系结构有着深远影响的需求,肯定是软件需求的⼀部分

软件架构过程的一般活动

活动 图中英文 输入 图中输出
识别 ASRs Specifying ASRs / Prioritized Quality Attribute Scenarios(按优先级排序的质量属性场景)
架构设计 Architecture design Prioritized Quality Attribute Scenarios(按优先级排序的质量属性场景);Requirements, constraints(需求、约束);Patterns and tactics(模式和战术) “Sketches” of candidate views, Determined by patterns(由模式决定的候选视图草图)
文档化 Documenting “Sketches” of candidate views, Determined by patterns(由模式决定的候选视图草图) Chosen, combined views ,documentations beyond views
架构评估 Architecture Evaluation Prioritized Quality Attribute Scenarios(按优先级排序的质量属性场景),Chosen, combined views ,documentations beyond views Chosen, combined views ,documentations beyond views

Stakeholders 参与

  • Specifying ASRs
  • Documenting
  • Architecture Evaluation

七类架构设计决策

类别 中文 考试解释
Allocation of responsibilities 职责分配 把功能责任和质量属性责任分配给具体软件元素;responsibility 不只等于功能,也包括为了满足性能、安全、可用性等质量需求而产生的责任
Coordination model 协调模型 说明运行时元素如何交互,包括谁能和谁通信、交互方向、传递数据还是传递控制
Data model 数据模型 说明数据结构、数据关系和生命周期,包括创建、读取、修改、删除、持久化等
Management of resources 资源管理 管理 CPU、内存、网络、存储、线程、连接池等软硬件资源
Mapping among architecture elements 架构元素映射 说明软件元素到硬件节点、部署环境、实现模块或团队之间的映射关系
Binding time decisions 绑定时机决策 决定元素关系和参数在什么时候确定:设计时、编译时、部署时、初始化时或运行时
Choice of technology 技术选择 选择语言、框架、中间件、数据库、协议和技术栈

Why should a software architecture be documented using different views? Give 4 example views

  • 不同视图支持不同目标和用途,服务不同利益相关者
  • 不同视图突出不同系统元素和关系
  • 不同视图也会以不同维度暴露质量属性问题

复习时可以把 Module Views、C&C Views、Allocation Views、Quality Views 放在一起比较。前三个主要回答“系统结构是什么”,Quality Views 主要回答“为了分析某个质量属性,需要把哪些相关结构集中起来看”。

类别 回答问题 Elements Relations 典型 views
Module Views 代码和实现单元如何组织 modules is part of、depends on、is a decomposition、uses、generalization、layered、domain、data model
C&C Views 系统运行时组件如何交互 components、connectors attachments、interface delegation pipe-and-filter、client-server、peer-to-peer、SOA、publish-subscribe、shared-data
Allocation Views 软件元素如何映射到环境 software elements、environmental elements allocated to deployment、installation、work assignment
Quality Views 为分析某个质量属性,应集中查看哪些相关结构 来自 module、C&C、allocation views 中与某个质量属性相关的元素 取决于被抽取的基础视图 security view、performance view、reliability view、communications view

Quality view 不是从零创造新元素,而是从 module、C&C、allocation views 中抽取与某个质量属性相关的元素,重新组织成面向质量属性分析的视图。

例子:

  • Security view:认证、授权、敏感数据、信任边界。
  • Performance view:请求路径、队列、缓存、瓶颈、延迟。
  • Reliability view:冗余、故障检测、切换、恢复。
  • Communications view:通信链路、协议、QoS。

连线题速记:

implementation units -> Module
runtime behavior and interactions -> C&C
non-software environment -> Allocation

中文速记:

实现单元怎么组织 -> Module Views
运行时组件怎么交互 -> C&C Views
软件元素如何映射到非软件环境 -> Allocation Views
分析某个质量属性需要集中看哪些结构 -> Quality Views

Architecture Documentation Package

架构文档包 = views + information beyond views。

Information beyond views 包括: 口诀:路法概映理目

英文 中文 作用
Documentation Roadmap 文档路线图 告诉读者文档有什么、在哪里找
How a View Is Documented 视图文档化说明 说明视图写法标准和符号约定
System Overview 系统概览 简要说明系统功能、用户、上下文、关键约束
Mapping Between Views 视图之间的映射 说明不同视图中的元素如何对应
Rationale 设计理由 / 决策依据 记录适用于多个 view 的架构决策,以及导致这些决策的背景、组织约束、重大需求和基础架构模式选择
Directory 参考材料目录 帮助读者快速找到更多信息,包括术语索引、术语表和缩略语表

主录境变理

英文 中文 作用
Primary Presentation 主要表示 / 主图 主图或主表,展示主要元素和关系,必须有图例
Element Catalog 元素目录 解释元素、关系、接口、行为和属性
Context Diagram 上下文图 说明该 view 的边界和外部环境
Variability Guide 可变性指南 说明哪些地方允许变化以及如何变化
Rationale 设计理由 / 决策理由 说明为什么这样设计

4+1 View Model

Kruchten 的 4+1 视图模型包括四个结构视图和一个场景视图。

View 中文 关注点
Logical View 逻辑视图 功能需求如何由主要抽象、类、对象、子系统实现
Process View 进程视图 并发、进程、线程、通信、同步、运行时行为
Physical View 物理视图 软件如何部署到硬件节点、网络和物理环境
Development View 开发视图 软件在开发环境中的组织,如模块、库、包、团队分工
Architecture use cases/Scenarios 场景 / 架构用例 捕获架构需求,并验证和串联其他四个视图

截屏2026-06-11 14.44.25

对应往年题:

  • 2017:Describe 4+1 view.
  • 2019:介绍 4+1 视图并画图。

ADD3.0

ADD = Attribute-Driven Design。它是一种以架构驱动因素为输入、通过迭代做架构决策的方法

  • Step1 Review Inputs
    • 确保本轮设计输入可用且正确,包括 Design Purpose、Primary functionality、Quality attribute 、Architectural Concerns、constrains,并确认 drivers 及其优先级
  • Step2 Establish the Iteration Goal by Selecting Drivers
    • 选择本轮要处理的 drivers,建立大小合适的迭代目标,可以解决一个重要 driver,也可以满足一组相关 drivers
  • Step3 Choose One or More Elements of the System to Refine
    • 选择要细化的系统元素,refinement 可以是分解为更细粒度元素、组合为更粗粒度元素,或改进之前已识别的元素
  • Step4 Choose One or more Design Concepts that Satisfy the Selected Drivers
    • 先识别候选 design concepts,再选择能满足本轮 drivers 的概念,例如 reference architectures、deployment patterns、architectural/design patterns、tactics、frameworks
  • Step5 Instantiate Architectural Elements,Allocate Responsibilities,and Define Interfaces
    • 将选定的 design concepts 实例化为具体架构元素,为元素分配职责,并定义元素之间的接口
  • Step 6 Sketch Views and Record Design Decisions
    • 草拟相关 views 并记录设计决策、理由、元素职责和接口,这些草图是架构的初始文档
  • Step7 Perform Analysis of Current Design and Review Iteration Goal and Achievement of Design Purpose
    • 分析当前设计,审查迭代目标和设计目的是否达成,并决定是否需要更多迭代(回到step2)

Design Process Termination Criteria

  • 设计过程会跨越多次迭代持续进行,直到至少满足下面三种其中之一
    • 已经为所有驱动性的架构需求做出设计决策,即达到设计目标
    • 最重要的技术风险已经得到缓解
    • 分配给架构设计的时间或预算被耗尽

记忆:先看输入,定目标;选对象,挑方案;再落地,写文档;最后评估 终止:做完了、风险稳了、钱/时间没了

  • Design of a greenfield system for a mature domain
    • 适用于 well-known domains,例如 desktop、mobile、web enterprise apps、microservices
    • Initial iteration goal:establish overall system structure,选择 reference architectures、patterns、frameworks,并优先考虑 non-functional constraints 和 quality attributes
    • Next iteration goal:identify structures for primary functionality,把 use cases 分配给 elements,分解 reference architecture elements,并规划 team assignments
    • Subsequent iterations:refine structures for remaining drivers,使用 tactics、patterns、components 和 best practices,例如 modularity、low coupling
    • Roadmap benefits:指导初始设计,帮助早期估算,用已知组件降低风险,并从一开始支持 quality goals
  • Design of a greenfield system for a novel domain
    • 适用于 less established infrastructure and knowledge base 的新领域
    • Start without reference architecture:没有现成模型或可复用组件,设计需要从 first principles 开始
    • Use prototyping and general concepts:用 patterns、tactics 和 quality attribute-focused prototypes 指导设计
    • Address emerging challenges:重点关注 performance、scalability、security,并保持 flexible iteration goals
  • Design for making changes to an existing system (Brownfield)
    • Brownfield architecture design 常由 maintenance、refactoring 或 resolving quality issues 驱动
    • Understand existing architecture first:先识别系统元素及其 interactions,再进行 decomposition 或 iteration planning
    • Design iterations post-assessment:理解现有架构后,ADD 步骤类似 greenfield design,但以增量方式处理新的 drivers
  • Design to replace a legacy application
    • Legacy tech and technical debt:旧系统可能依赖 obsolete technology,或存在难以管理的 technical debt
    • Use the Strangler Fig Pattern:引入 proxy,把调用路由到 legacy systems,同时逐步替换 components
    • Iterative replacement:每轮 ADD 的设计目标针对要迁移的 specific services or components

Design concepts

类别 说明
Reference Architectures 领域化蓝图,比 architecture style 更具体
Deployment Patterns 物理部署组织方式,如 3-tier、cluster、failover
Patterns 反复出现设计问题的可复用方案
Tactics 影响质量属性响应的细粒度设计决策
Externally Developed Components 外部组件和框架,如 Spring、Hibernate

微服务架构的特性

通过服务组件化

  • 组件是可以独立替换或升级的软件单元
  • 进程外组件
    • 独立服务
  • 进城内组件
    • 类、对象或库的形式

围绕业务能力组织

  • 团队是跨职能的
  • 开发团队负责软件的整个产品周期,而非开发完解散

内聚和解耦

  • 内聚:单一职责,有各自的领域逻辑
  • 解耦:微服务间尽量减少直接依赖,独立自治

去中心化

  • 去中心化治理:微服务可以有自己的技术栈选择,只需要约定接口;运维只需要知道微服务的部署规范
  • 去中心化数据存储:每个服务管理自己的数据库
  • 去中心化数据管理:服务间强调无事务协作,最终一致性和补偿策略,需要权衡业务损失和修复代价

基础设施自动化

  • 依靠云原生、自动化构建、自动化部署、监控和运维,降低微服务开发和运维成本。

服务设计与演进

  • 高可用设计:容忍失败 监控日志 快速发现修复
  • 演进式设计:频繁增量变更 解耦

架构模式演化

核心思想

架构 到底在组织什么
最早期 组织稳定执行:程序和数据组成作业,围绕批处理与调度运行
主机 / 终端 组织核心事务:事务、数据、权限集中在主机,终端主要输入与显示
C/S 组织交互能力:客户端承担 UI 与部分逻辑,服务器管理共享数据
三层 / 分层 组织职责边界:表示层、业务层、数据层分离,降低系统内部耦合
SOA 组织企业服务能力:通过服务契约暴露可复用能力,支撑跨系统整合
微服务 组织独立演进单元:围绕业务能力拆服务,使团队、代码和发布边界对齐
事件驱动 / 云原生 组织运行时协作:事件负责异步协作,平台负责部署、扩缩容、恢复和观测

质量属性取舍

不要只背优缺点,要说明这些优缺点为什么由结构产生。

架构 优先保障 相对牺牲 / 新复杂性
主机 / 终端 一致性、安全性、可靠性、可审计性 易用性、交互响应性、局部修改灵活性
C/S 易用性、响应性、桌面交互体验 可部署性、可维护性、版本一致性、统一治理
三层 / 分层 可维护性、可修改性、安全边界、部署治理 极致性能、跨系统复用、团队自治速度
SOA 互操作性、可复用性、可组合性、可治理性 简单性、响应性能、轻量部署、局部演进速度
微服务 可部署性、可扩展性、可修改性、演进速度 强一致性、运维简单性、故障定位、全局理解
事件 / 云原生 弹性、韧性、可扩展性、可用性、自动化运维 可理解性、可调试性、时序可预测性、强一致性

架构迁移原因

迁移不是“旧模式错了”,而是旧模式擅长解决的矛盾已经不再是系统最主要的矛盾。迁移逻辑通常来自规模、复杂度、维护成本和协作方式的变化。

架构 为什么旧架构“不够用了”
最早期 只适合固定任务和离线批处理,难以支撑多人共享核心事务
主机 / 终端 交互能力弱,终端灵活性低
C/S 客户端安装升级重,版本与兼容难治理
三层 / 分层 单系统可维护性提升,但跨系统复用不足
SOA 企业级整合增强,但治理与总线较重
微服务 局部发布更快,但分布式复杂度上升
事件 / 云原生 更适合高波动运行时,但时序与排障更难

架构简图

最早期

最早期软件开发结构骨架

主机 / 终端

主机终端结构骨架

C / S 架构

C/S 架构结构骨架

三层 / 分层

三层分层结构骨架

SOA

SOA 结构骨架

微服务

微服务结构骨架

事件驱动 / 云原生

事件驱动云原生结构骨架

微服务部分

直接看架构复习部分,要背的太多了