C4架构图使用方法


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


一、C4架构图的四个分层(深度递进视角)

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图的三大核心价值

C4模型使用方法

  1. 打破沟通壁垒
    产品经理看Context图 → 架构师讨论Containers → 开发人员实现Components → 无需所有人理解全量细节

  2. 精准防控软件腐化

    • 自动化SDLC核验(如API调用不符组件图时告警)
    • 架构守护工具 (ArchtUnit) 基于C4规范约束
  3. 降低认知负荷

    - 业务方:“为什么接入新物流商要6个月?” → 查看Containers图中强耦合的接口设计
    - 开发组:“库存服务重构影响范围?” → 追踪Components图的依赖链路
    

四、C4图的实用绘制指南

1. 工具选型建议

工具 适用场景 自动化能力
Structurizr 专业架构设计 代码提取/持续集成
PlantUML 开发人员快速草图 文本转图
Draw.io 非技术团队协作 手动绘制

2. 典型反模式预警

- 错误1:将消息队列画在Context层(应属于Containers层)
- 错误2:在容器图中标注Java版本号(细节过度暴露)
+ 正确做法:将技术规格描述与图示分离,用侧边文档说明

五、行业最佳实践案例

阿里双十一架构演进文档

  • 上下文图:突出电商平台与银行/物流/供应商的协同
  • 容器图:展示Tair缓存集群、Flink实时大屏、HSF服务框架
  • 组件图:拆解交易链路的风控、库存计算等关键服务
  • 代码图:核心算法如库存扣减的分布式锁实现

通过C4架构图的层次化表达,既能避免过度设计导致的复杂性蔓延,又能精准传递关键架构决策,是现代软件工程中不可或缺的可视化沟通工具。

posted @ 2025-03-17 20:51  好奇成传奇  阅读(181)  评论(0)    收藏  举报