架构
概述
软件架构(Software Architecture)是一种用来管理复杂性的工程学科,其目标是在软件系统漫长生命周期中,在有限条件下做最优权衡,构建、演进、运行并维护系统。它不仅满足非功能性需求(可维护性、可扩展性、可靠性、可测试性、可部署性),更承担沟通、决策、治理等组织层面的职能。
架构本质上是一组长期可复用的设计决策,这些决策定义了系统的组织结构、组件及联系、行为协作、限制与约束,并指导系统的持续演化。架构作为团队协作的契约,约束不同模块/服务间的交互方式,使团队在系统演进过程保持一致性与可替换性。
架构的本质
架构的核心目标
在有限条件下做最优权衡,以最小成本完成系统长期构建与维护。
本质上解决两件事:
- **让系统能运转(行为价值)** — 满足当前业务需求
- **让系统能持续修改(架构价值)** — 适应未来的变化
架构价值的丧失,会导致系统不可维护、业务扩展受阻、组织效率下降。
架构的核心原则
- **推迟决策(Decide Late)**:越晚决定细节,越能基于更多信息做更优选择。
- **隔离变化(Isolate Change)**:将变化源隔离在局部,使局部变更不破坏整体。
- **保持可选项(Keep Options Open)**:架构的策略是尽量长时间地保留尽可能多的可选项。
- **稳定依赖方向(Stable Dependencies)**:低层实现依赖高层策略,而不是反过来。
它们都服务于同一个目标——降低变更成本。架构的本质是在漫长生命周期中管理变化,这些原则是管理变化的具体手段
策略与细节分离
软件可以抽象为两类内容:
- **策略(业务逻辑)**:真正赚钱、省钱的核心逻辑,变化较少
- **细节(技术实现)**:数据库、Web 框架、消息队列等,频繁变化
保持边界,使细节的变化不影响策略,是"整洁架构""六边形架构""DDD"等架构风格的共同目标。
现实与目标的差距
上述描述是目标状态——好的架构应该策略稳定、细节灵活。但实际上:
- 策略变化是外部驱动的(市场、竞争、法规),无法阻止
- 技术实现一旦选定,就会通过代码、团队技能、数据、供应商形成锁定
- 细节难以替换的代价远高于继续使用,技术债因此不断积累
这恰恰证明了架构设计的必要性——正是因为"细节难以替换"是现实,才更需要通过边界隔离、依赖反转、保持可选项等原则,让业务逻辑不依赖具体技术实现,从而降低系统生命周期中的变更成本。
架构核心要素
软件架构的核心要素构成系统的基础组织结构,是架构定义的最小完整集
组件(Component)
组件是软件系统的基本构建单元,具有以下特征:
| 特征 | 说明 |
|---|---|
| 语义完整性 | 语义完整、语法正确、有可重用价值 |
| 接口封装 | 通过接口提供数据转换,不暴露内部实现 |
| 外部属性 | 组件对其他组件承担的责任(提供的服务、所需服务、性能特征、错误处理、资源使用) |
组件可嵌套组合:组件由更小的组件和接口构成,形成层次结构。
连接器(Connector)
连接器是组件间通讯、协调或合作的仲裁机制,是架构的核心黏合剂:
| 类型 | 示例 |
|---|---|
| 过程调用 | 同步/异步方法调用 |
| 消息传递 | 消息队列、事件总线 |
| 远程调用 | RPC、gRPC |
| 数据流 | Pipe-Filter 模式中的数据管道 |
连接器将组件解耦,使组件可独立变更。
数据(Data)
数据是组件通过连接器接收或发送的信息元素:
- 字节序列、消息、序列化对象
- **不是**:永久存储、组件私有信息
数据与组件/连接器共同构成完整的架构结构。
接口(Interface)
接口是组件与连接器交互的契约,定义输入输出格式、调用协议和行为语义。
契约设计权衡:
| 契约类型 | 严格程度 | 适用场景 |
|---|---|---|
| RPC(如 gRPC) | 严格 | 内部服务、强类型语言 |
| REST | 中等 | 跨语言、开放API |
| 事件驱动 | 宽松 | 异步、松耦合 |
约束(Constraint)
约束是架构决策的边界条件,包括技术约束、业务约束、组织约束和经济约束。
环境(Environment)
组件与环境的关系是架构定义的必要部分。环境包括外部系统、硬件/基础设施、用户/干系人,决定了架构的上下文和约束边界。
架构能力模型
从软件生命周期视角,架构的能力模型可分为以下六类:
为什么需要架构能力模型
没有模型指导时,架构设计容易顾此失彼——只看开发视图会导致部署困难,只看性能会丧失可维护性,只看当前会忽视未来变化。
能力模型的价值:
- **完整性检查** — 四个视图构成完整覆盖,不遗漏关键维度
- **权衡框架** — 当不同视图冲突时,有结构化的方式讨论取舍
- **沟通语言** — 团队用同一套框架讨论架构,减少误解
- **责任划分** — 不同能力归属不同角色/团队
开发视图
关注团队结构、模块组织、代码可维护性。降低协作成本。
- 架构反映团队结构(康威定律)
- 模块化、领域划分、可测试性
部署视图
关注系统如何构建、发布、扩容。降低发布成本。
- 一键部署
- 多环境体系
- 发布与回滚策略
运行视图
关注运行时行为。降低故障成本。
- 高可用
- 性能
- 调度
- 弹性能力
维护视图
关注问题诊断、变更成本、可观测性。降低诊断成本。
- 风险:改动引发的新问题
- 探秘成本:找问题的代价
架构解耦体系
解耦是降低变更成本的核心手段——把变化锁在局部,不让它扩散到全局
解耦的维度
- **源码解耦**:类/模块依赖管理
- **部署解耦**:可独立部署单元
- **服务解耦**:服务边界定义、协议、治理
架构是可以"生长"的:单体 → 可部署单元 → 微服务 → 服务网格
一个好的架构应该同时支持:
- 从单体生长为服务化
- 服务化退化为单体
去冗余(重复识别)
分辨:
- 表面重复
- 本质重复(真正需要抽取)
独立性
- 开发独立性(多人并行)
- 部署独立性(独立发布)
插件式架构思想
软件发展史,就是增加"可插拔点"的历史。插件的目标:
- 可去掉
- 可替换(多个实现)
单向边界(依赖反转)
依赖方向应指向更稳定的方向——内层不依赖外层,外层依赖内层。

架构分类
基础设施架构
- 云平台、操作系统、网络、存储
中间件与数据架构
- MQ、RPC、流计算、大数据平台
业务系统架构
- 通用软件系统
- 离线分析系统(Data Warehouse)
- 在线业务系统
随着技术发展,边界正不断融合与渗透。
架构视图体系
视图是表达架构的方式,不是架构本身。
架构图绘制的 4R 原则
- **Rank**:确定图的抽象级别(L0~L4)
- **Role**:识别系统角色
- **Relation**:绘制角色间关系
- **Rule**:基于关键场景绘制协作方式
4+1 视图
┌─────────────────────────────────────────────────────────┐│ 场景 (Scenarios) ││ ┌─────────────────┐ ││ │ 验证与驱动 │ ││ │ 视图设计 │ ││ └────────┬────────┘ ││ 把视图串联在一起 ─────── ─────── │└─────────────────────────────────────────────────────────┘ ↑ ↑ ↑ ┌────┴────┐ ┌────┴────┐ ┌────┴────┐ │ 逻辑视图 │ │ 实现视图 │ │ 进程视图 │ │ Logical │ │Impl View│ │ Process │ └────┬────┘ └────┬────┘ └────┬────┘ ↑ ↑ ↑ 开发人员创建 构建系统创建 运行组件描述 类/包 + 关系 模块(JAR/WAR) 进程 + IPC + 依赖关系 ┌────┴────┐ │ 部署视图 │ │Physical │ └────┬────┘ ↑ 机器 + 进程 网络连接包含:
- 逻辑视图:领域、职责、接口
- 实现视图:代码结构、构建依赖
- 进程视图:运行时交互
- 部署视图:机器、容器部署关系
- 场景视图:用户视角的用例与时序
各类常见架构图
业务架构图

前端架构图

系统架构图


应用架构图

部署架构图

系统序列图

架构立方体六维度:逻辑 / 物理 / 应用 / 技术 / 功能 / 部署
架构边界设计
架构设计的核心是边界管理——把变化锁在边界内,让边界外不受影响。
边界管理的内容:
- 隔离策略与细节
- 控制跨层依赖方向
- 定义边界契约
边界管理的价值:
- 通过边界推迟技术决策
- 变化的影响控制在局部
边界划分的方式
- 按领域划分
- 按用例划分
- 按部署/线程/进程/服务划分
过度设计 vs 不足设计
边界必须谨慎,过度设计常比不足更糟糕。
过度设计是用复杂性换取想象中的灵活性;不足设计是用今天的简单换明天的改动成本。
架构演进的规律是:演化式成长优于预判式设计。猜错边界的代价 >> 慢慢改的代价。代码可以删掉,概念和抽象删不掉。
架构演进
从后端视角来看,系统演进路径通常是:
- Mainframe
- 原始分布式
- 单体 Monolithic
- SOA
- 微服务 Microservices
- 服务网格 Service Mesh
- 无服务 Serverless
"微服务的价值不是细粒度,而是解耦与自治能力。"
架构认知流派
架构并非单一视角,而是多种思想共同构成的认知框架。不同流派从不同角度解释"什么是架构",它们并非互斥,而是互补关系。理解这些流派有助于在复杂系统中选择更合适的架构方式。
结构派
关注系统由哪些模块组成,以及模块如何连接。
核心思想: 架构 = 组件 + 连接方式。
适用:系统建模、部署规划、宏观结构设计。
常见产物:分层架构、微服务架构图、C4 Model。
决策派
将架构视为一系列长期关键决策,这些决策决定了系统生命周期成本。
核心思想: 架构 = 重要且难以逆转的决策(Architecturally Significant Decisions)。
适用:架构评审、架构治理、技术选型、演进规划。
常见产物:ADR(Architecture Decision Record)、RAID Matrix。
模式派
通过复用经过验证的模式解决架构问题。
核心思想: 架构 = 上层设计模式(Architectural Patterns)。
典型模式:分层架构、事件驱动架构、CQRS、微内核、SOA。
适用:寻找通用解决方案、形成团队共识。
领域驱动派
以业务领域为中心组织系统结构,使软件与业务演进保持一致。
核心思想: 架构 = 领域边界 + 领域模型 + 上下文协作方式。
关键概念:限界上下文、上下文映射、核心域、策略建模。
适用:复杂业务系统、持续迭代系统、组织规模较大的团队。
进化派
关注架构的可变化性和演进能力,强调持续反馈与可替换性。
核心思想: 架构 = 支持持续变更的技术体系 + 演进机制。
原则:可测量、可演进、保持架构可选项(Fitness Function)。
适用:快速变化的业务环境、云原生体系、微服务系统。
系统论派
将软件视为复杂系统,通过系统动力学理解行为与结构。
核心思想: 架构 = 影响系统行为的结构性约束。
关注:反馈回路、瓶颈、边界、系统行为模式(如雪崩、拥塞)。
适用:大型分布式系统、复杂组织架构调整。
工程派
强调架构作为工程实践的综合体,包含流程、规范、工具链、治理。
核心思想: 架构 = 人、流程、工具的整体协作体系。
涉及:DevOps、CI/CD、架构治理、质量保障体系。
适用:中大型组织、要求高可靠性的行业。
架构治理
架构不仅是技术问题,更是治理问题。治理的目标是让架构在组织规模扩张过程保持一致性与可控性。
不治理的代价
架构决策会随时间失效,系统会腐化。没有治理的系统:
- 决策失传 — 知识随人员流失,新人重复踩坑
- 一致性丧失 — 各团队各行其是,系统整合成本指数增长
- 债台高筑 — 技术债务积累,变革能力逐渐丧失
- 风险失控 — 系统性风险隐匿,直到爆发才暴露
治理的本质是对抗组织熵增——把架构从"一次设计"变成"持续工程",保护架构价值、延长系统寿命。
架构治理的组成
- **决策治理(ADR 流程)**:记录重要架构决策、权衡、风险、备选方案。
- **演进治理**:控制技术债务、规划迁移路线、设定演进节奏。
- **一致性治理**:制定编码规范、API 规范、数据规范、服务边界规范。
- **风险治理**:识别架构风险(R)、假设(A)、问题(I)、依赖(D)。
常用治理机制
- 架构委员会(ASG)
- 架构评审(ADR Review)
- 架构基线与版本管理
- 架构 Scorecard(可维护性、稳定性、复杂度)
架构质量属性
架构的优劣取决于其质量属性(NFR,而非功能需求):
- **可维护性(Maintainability)**:复杂度、边界定义、可测试性。
- **可扩展性(Scalability)**:弹性、横向扩容、无状态化。
- **可用性(Availability)**:故障域、隔离、熔断、降级。
- **性能(Performance)**:延迟、吞吐、资源利用。
- **可演进性(Evolvability)**:替换成本、架构可选项。
- **可观测性(Observability)**:指标、日志、追踪链路。
架构设计需基于关键质量属性进行技术选型与边界规划。
架构的度量体系
架构领域充斥大量主观判断,缺乏客观标准。为了减少架构的"玄学成分",需要可量化的度量,把架构质量从感觉变为可衡量的数字:
代码结构度量
- 依赖深度(Dependency Depth)
- 环依赖数量(Cycles)
- 模块内聚度(Cohesion)
- 模块耦合度(Coupling)
运行度量
- MTTR(平均修复时间)
- MTBF(平均无故障时间)
- 错误预算(Error Budget)
架构可演进度量
- 新功能上线时间(Lead Time)
- 回滚成本
- 替换 MQ/DB 的成本(可选项评分)
架构技术债务
技术债务不可避免,但需要治理:
- **结构性技术债务**:边界错位、耦合混乱、数据模型腐化。
- **技术选型债务**:使用过时框架、依赖复杂工具。
- **过程性债务**:缺少规范、缺少自动化、缺少测试。
治理策略:
- 建立债务台账(Debt Register)
- 设定年度偿还率(例如 15%)
- 每次迭代保留"架构演进配额"
架构安全模型
架构必须内建安全,不可后补:
- Least Privilege(最小权限)
- Zero Trust(零信任)
- 配置安全(Secrets 管理)
- 数据安全(加密、脱敏)
- API 安全(认证、鉴权、率限制)
- 审计与追踪
架构的未来
未来的软件架构将呈现以下趋势:
云化与 XaaS 化
- 基础设施、平台、软件服务逐渐云端化(IaaS/PaaS/SaaS)。
- 架构设计更关注服务边界、弹性、自动扩缩容和多租户支持。
自动化运维与治理
- 架构与运维(DevOps/PlatformOps)深度融合。
- 自动化部署、监控、扩展和治理成为标准。
- 架构治理工具和度量体系将普及,提高架构可控性。
演进式架构
- 架构设计强调可演进、可测量和可替换。
- Fitness Function 评价架构决策和系统行为。
- 支持快速业务变更与持续交付。
云原生与服务网格
- 微服务进一步解耦、容器化、服务治理由平台提供。
- 服务网格(Istio、Linkerd)提升可观测性、流量控制、策略执行能力。
无服务器架构
- 上传函数即运行,彻底屏蔽基础设施管理。
- 高度事件驱动、按需扩展。
- 架构关注事件流、函数组合、服务质量保障。
安全与合规驱动的架构
- 安全内建(Security by Design),数据隐私与合规性成为架构首要考量。
- 零信任、最小权限、多层防护体系。
智能化架构
- 利用 AI/ML 辅助架构决策、容量预测、性能优化。
- 自动化推荐架构改进、优化服务组合。
架构作为组织能力
- 架构不仅解决技术问题,还支持组织敏捷、业务连续性和知识传承。
- 架构演进能力成为组织核心竞争力。
关联内容
- [/软件工程/架构/架构师.html](/软件工程/架构/架构师.html) 架构师作为软件架构的核心角色,负责制定架构决策
- [/软件工程/架构/架构治理.html](/软件工程/架构/架构治理.html) 架构治理是确保架构在组织层面得以有效实施和持续演进的关键手段
- [/软件工程/架构/技术债务.html](/软件工程/架构/技术债务.html) 技术债务是架构决策的隐性成本,与架构治理密切相关
- [/软件工程/架构/演进式架构.html](/软件工程/架构/演进式架构.html) 演进式架构强调架构的可演化性,与架构的未来趋势直接关联
- [/软件工程/架构/架构重构.html](/软件工程/架构/架构重构.html) 架构重构是保持架构健康的重要手段,与架构演进和治理密切相关
- [/软件工程/架构/Serverless.html](/软件工程/架构/Serverless.html) Serverless是未来架构演进的重要方向,与无服务器架构趋势对应
- [/软件工程/微服务/微服务.html](/软件工程/微服务/微服务.html) 微服务是现代软件架构演进的重要方向,体现了架构解耦、自治与服务化的核心思想
- [/软件工程/微服务/ServiceMesh/ServiceMesh.html](/软件工程/微服务/ServiceMesh/ServiceMesh.html) Service Mesh是微服务架构演进的重要阶段,体现了架构解耦和治理的发展
- [/软件工程/架构模式/架构模式.html](/软件工程/架构模式/架构模式.html) 架构模式是解决软件架构问题的可复用解决方案,为架构设计提供参考模板
- [/软件工程/架构模式/分层架构.html](/软件工程/架构模式/分层架构.html) 分层架构是基础架构模式之一,体现了架构设计中的分治思想和边界管理
- [/软件工程/架构模式/响应式架构.html](/软件工程/架构模式/响应式架构.html) 响应式架构是现代分布式系统架构的重要模式,强调弹性、消息驱动和回弹性
- [/软件工程/架构/系统设计/云原生.html](/软件工程/架构/系统设计/云原生.html) 云原生是现代架构演进趋势,与架构的未来发展方向一致
- [/软件工程/架构/系统设计/可观测性.html](/软件工程/架构/系统设计/可观测性.html) 可观测性是现代架构质量的重要属性,与架构设计中的治理和度量理念相关
- [/软件工程/架构/系统设计/缓存.html](/软件工程/架构/系统设计/缓存.html) 缓存是提升系统性能的关键基础设施,与架构的性能质量属性相关
- [/软件工程/架构/系统设计/故障管理.html](/软件工程/架构/系统设计/故障管理.html) 故障管理是保障系统可用性的重要机制,与架构的可用性质量属性相关
- [/软件工程/架构/系统设计/伸缩性.html](/软件工程/架构/系统设计/伸缩性.html) 伸缩性是架构可扩展性的具体体现,与架构的质量属性直接关联
- [/软件工程/领域驱动设计.html](/软件工程/领域驱动设计.html) 领域驱动设计是架构边界划分的重要方法论,与系统的架构设计密切相关
- [/软件工程/架构/架构思维.html](/软件工程/架构/架构思维.html) 架构思维是架构设计的核心方法论,关注业务需求、约束条件和全生命周期管理
- [/软件工程/架构/系统设计/架构设计.html](/软件工程/架构/系统设计/架构设计.html) 系统架构设计是软件架构的具体实践,补充了架构文档中的理论知识
- [/软件工程/架构/Web前端/前后端分离.html](/软件工程/架构/Web前端/前后端分离.html) 前后端分离是系统架构设计中的重要模式,体现了边界划分和解耦原则
- [/计算机网络/网络安全/安全架构.html](/计算机网络/网络安全/安全架构.html) 安全架构是整体架构设计中不可或缺的部分,涉及安全策略和防护措施
- [/编程语言/编程范式/响应式编程.html](/编程语言/编程范式/响应式编程.html) 响应式编程是实现响应式架构的技术手段,体现了架构与编程范式的关联