C4模型:像“代码的谷歌地图”一样可视化软件架构

“C4模型帮助团队清晰、一致且在适当的细节层次上沟通软件架构。”
— 西蒙·布朗

该 C4模型 (上下文、容器、组件、代码)是一种分层的、可缩放的软件架构文档框架。它旨在成为 开发者友好符合敏捷开发,以及 可读 —— 超越杂乱、静态的“方框和线条”图示。

它使团队能够:

  • 在技术与非技术利益相关者之间有效沟通架构。

  • 保持一致且版本可控的文档。

  • 专注于 真正重要的事情 在每个抽象层次上。


🔍 C4模型的核心抽象

The Ultimate Guide to C4 Model Visualization with Visual Paradigm's AI Tools - ArchiMetric

层级 概念 目的
层级1:上下文 系统与人员 谁在使用该系统?它如何与环境交互?
层级2:容器 可部署单元 高层次的技术组件(应用程序、数据库、API)有哪些?
层级3:组件 逻辑分组 容器内部的功能是如何组织的?
第4层:代码(可选) 类、接口、方法 实现细节——通常由IDE生成。

✅ 关键原则仅在需要时才放大。先从整体开始,再逐步深入。


🧩 关键元素与关系

元素 描述 示例
人员 人类参与者或用户 客户管理员第三方API
软件系统 提供价值的系统 网上银行系统
容器 可部署单元(运行时或可部署) Web应用、微服务、数据库、无服务器函数
组件 相关功能的逻辑分组 认证模块支付处理程序大型机外观
关系 元素之间的通俗语言连接 “使用”“调用”“读取/写入”“依赖于”

💬 使用自然语言用于关系。避免使用“连接到”之类的模糊术语。


📊 C4 模型层级及 PlantUML 示例

📌 所有示例均使用C4-PlantUML 库以确保一致性和自动化。


1. 系统上下文图(第1级)

谁使用该系统?它与哪些外部系统交互?

🎯 受众:非技术利益相关者、产品负责人、高管。

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml
LAYOUT_WITH_LEGEND()
title 互联网银行系统上下文图

Person(customer, "客户", "一位个人银行客户")
System(banking_system, "互联网银行系统", "允许客户查看账户并进行支付")
System_Ext(mainframe, "大型机银行系统", "存储所有核心银行数据")

Rel(customer, banking_system, "使用")
Rel_R(banking_system, mainframe, "从其获取账户信息")
@enduml

✅ 关注点:范围和边界系统的范围和边界。


2. 容器图 (第2级)

主要的技术组件及其技术是什么?

🎯 目标受众: 架构师、开发人员、DevOps工程师。

@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

Person(customer, "客户", "一位个人银行客户")
System_Boundary(c1, "网上银行系统") {
    Container(web_app, "Web应用", "Java, Spring MVC", "向用户交付内容")
    Container(api_app, "API应用", "Java, Spring Boot", "通过JSON/HTTPS提供功能")
    ContainerDb(db, "数据库", "关系型数据库", "存储用户数据")
}

System_Ext(mainframe, "主机银行系统", "存储所有核心银行数据")

Rel(customer, web_app, "使用", "HTTPS")
Rel(web_app, api_app, "调用", "JSON/HTTPS")
Rel(api_app, db, "读取/写入", "JDBC")
Rel(api_app, mainframe, "使用", "XML/HTTPS")
@enduml

✅ 关注点:技术选型部署边界数据流.


3. 组件图 (第3级)

API应用的内部结构是怎样的?

🎯 目标受众: 开发人员、技术负责人、团队负责人。

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml
LAYOUT_WITH_LEGEND()
title 网上银行系统中API应用的组件图

Container(api_app, "API应用", "Java, Spring Boot")
ContainerDb(db, "数据库", "关系型数据库")
System_Ext(mainframe, "主机银行系统")

Container_Boundary(api_boundary, "API应用") {
    Component(sign_in, "登录控制器", "MVC控制器", "允许用户登录")
    Component(security, "安全组件", "Spring Security", "处理认证")
    Component(mainframe_facade, "主机接口", "DAO", "与主机系统通信")

    Rel(sign_in, security, "使用")
    Rel(security, db, "读取/写入")
    Rel(sign_in, mainframe_facade, "使用")
    Rel(mainframe_facade, mainframe, "使用")
}
@enduml

✅ 关注点:内部结构职责依赖关系.


4. 代码图 (第4级 – 可选)

实现细节:类、接口、方法。

🎯 目标受众:开发人员、代码审查者。

⚠️ 不建议手动绘制 — 最好通过IDE(例如IntelliJ、VS Code)使用自动绘图工具生成。

示例(简化版):

@startuml
class SignInController {
  +signIn()
  +validateCredentials()
}

class SecurityComponent {
  +authenticate()
  +generateToken()
}

class MainframeFacade {
  +fetchAccountData()
  +sendTransaction()
}

SignInController --> SecurityComponent : 使用
SecurityComponent --> Database : 读取/写入
MainframeFacade --> MainframeAPI : 使用
@enduml

✅ 最佳实践:自动化 使用类似工具来实现此级别PlantUML + IDE 插件.


✅ 最佳实践与核心原则

原则 为何重要
迭代优化 从上下文开始 → 仅在需要时添加细节。避免过度文档化。
图表即代码 存储 .puml 文件到Git中。支持版本控制、CI/CD、协作和差异对比。
包含图例 始终解释符号、颜色和约定(例如 红色 = 外部蓝色 = 内部).
聚焦于沟通 图表应传递信息,而非炫技。简洁 > 完整性。传递信息,而非炫技。简洁 > 完整性。
使用“系统概览”图表 展示多个系统在组织内如何交互。
使用“动态”图表 添加时序图以展示运行时行为(例如,登录流程)。
合理界定范围 组件图必须限定在单一容器内within a single container不要混合容器!

🛠 工具与生态系统

  • PlantUML + C4-PlantUML 库– 免费,基于文本,支持版本控制。

  • Visual ParadigmLucidchartDraw.io– 通过模板支持 C4。

  • IDE 插件– 从代码自动生成 C4 图表(例如,IntelliJ + PlantUML 插件)。

  • CI/CD 集成– 将图表生成作为构建流水线的一部分。


📚 参考资料与进一步阅读


🎯 最后思考

C4模型并非追求完美的图表——而是关于在合适的细节层次上讲述正确的故事.

使用它来:

  • 更快地让新开发人员上手。

  • 统一团队对系统边界的认知。

  • 用非专业术语与利益相关者沟通。

  • 随着代码的演进,同步更新架构文档。


✅ 专业提示:从一个系统上下文图表开始。然后,随着团队需求的演变,逐步扩展模型——就像一街一街地构建地图一样。


如果需要,请告诉我:

  • 本指南的可下载PDF版本

  • 包含Git中C4图表的模板仓库

  • 从代码生成C4图表的自动化脚本

  • 与其他模型(例如,4+1视图、Zachman)的对比

愉快地绘图吧! 🖥️📘