C4架构图使用方法
C4架构图是一种层次化软件架构可视化方法,通过四个不同抽象层级(Context, Containers, Components, Code)描述系统结构与交互关系,其核心价值在于为不同角色的利益相关者提供恰到好处的技术细节。
一、C4架构图的四个分层(深度递进视角)

1. 上下文图(Context Diagram) - CEO视角
graph TD
A[电商系统] -->|使用| B(支付平台)
A -->|同步库存| C(ERP系统)
A -->|服务调用| D(物流服务商)
A -.-> E(移动端用户)
A -.-> F(后台管理员)
作用:展示系统与外部实体的交互关系,回答"系统存在的商业价值是什么"
典型受众:业务决策者、产品经理
关键要素:
- 主系统边界
- 外部用户角色(用户/管理员)
- 第三方系统(支付/物流等)
2. 容器图(Containers Diagram) - 架构师视角
flowchart TB
subgraph 电商系统边界
WEB[Web应用] --> API[Spring Cloud Gateway]
API --> SVC1[用户服务]
API --> SVC2[商品服务]
SVC1 <--> DB[(MySQL)]
SVC2 --> ES[(Elasticsearch)]
SVC2 --> MQ[(RocketMQ)]
end
WEB -->|CDN加速| 用户
SVC1 -->|调用| 微信支付
作用:揭示系统内部运行时的技术组成部分,回答"系统由哪些技术服务构成"
技术规格:
- 部署形态:Docker容器/K8s集群
- 通信协议:REST/gRPC
- 存储引擎:MySQL+MongoDB
- 技术栈:Java/Node.js
3. 组件图(Components Diagram) - 开发团队视角
用户服务模块分解:
@startuml
package "用户服务" {
[认证组件] as Auth
[会员组件] as Member
[权限组件] as ACL
[消息通知] as Notify
}
Auth --> Member : 查询用户数据
Member --> ACL : 鉴权
Auth --> Notify : 发送验证码
@enduml
编码级关注点:
- 组件间依赖关系
- 接口契约定义
- 领域模型边界划分
- 事务传播方式
4. 代码图(Code Diagram) - 程序员视角
用户认证流程类图:
// 代码层示例(简化版)
class AuthController {
+ login() : ResponseEntity
- authService: AuthService
}
class AuthService {
+ authenticate() : UserDTO
- userRepo: UserRepository
- jwtUtil: JwtUtils
}
interface UserRepository extends JpaRepository<User, Long> {
User findByUsername(String name);
}
实现细节:
- 类方法与属性定义
- 设计模式应用(如工厂/策略模式)
- 方法级调用时序
- 缓存/锁实现细节
二、C4图与其他架构图的本质区别
| 对比维度 | C4模型 | 传统架构图 |
|---|---|---|
| 核心思想 | 分角色视角递进展开 | 单一技术视图 |
| 信息含量控制 | 分层屏蔽不相关细节 | 混杂呈现所有信息 |
| 文档可维护性 | 支持增量更新,各层独立演进 | 修改牵一发而动全身 |
| 工具支持 | Structurizr/PlantUML专业化工具 | Visio/PPT通用绘图工具 |
| 生命周期 | 贯穿需求-设计-开发全过程 | 侧重设计阶段 |
三、C4图的三大核心价值

-
打破沟通壁垒
产品经理看Context图 → 架构师讨论Containers → 开发人员实现Components → 无需所有人理解全量细节 -
精准防控软件腐化
- 自动化SDLC核验(如API调用不符组件图时告警)
- 架构守护工具 (ArchtUnit) 基于C4规范约束
-
降低认知负荷
- 业务方:“为什么接入新物流商要6个月?” → 查看Containers图中强耦合的接口设计 - 开发组:“库存服务重构影响范围?” → 追踪Components图的依赖链路
四、C4图的实用绘制指南
1. 工具选型建议
| 工具 | 适用场景 | 自动化能力 |
|---|---|---|
| Structurizr | 专业架构设计 | 代码提取/持续集成 |
| PlantUML | 开发人员快速草图 | 文本转图 |
| Draw.io | 非技术团队协作 | 手动绘制 |
2. 典型反模式预警
- 错误1:将消息队列画在Context层(应属于Containers层)
- 错误2:在容器图中标注Java版本号(细节过度暴露)
+ 正确做法:将技术规格描述与图示分离,用侧边文档说明
五、行业最佳实践案例
阿里双十一架构演进文档:
- 上下文图:突出电商平台与银行/物流/供应商的协同
- 容器图:展示Tair缓存集群、Flink实时大屏、HSF服务框架
- 组件图:拆解交易链路的风控、库存计算等关键服务
- 代码图:核心算法如库存扣减的分布式锁实现
通过C4架构图的层次化表达,既能避免过度设计导致的复杂性蔓延,又能精准传递关键架构决策,是现代软件工程中不可或缺的可视化沟通工具。
定位问题原因*
根据原因思考问题解决方案*
实践验证方案有效性*
提交验证结果

浙公网安备 33010602011771号