点击看第四范式、百度、Zilliz、火山引擎公司的AI基础设施变革之路>> 了解详情
写点什么

用于软件架构的 C4 模型

  • 2018 年 6 月 30 日
  • 本文字数:2458 字

    阅读完需:约 8 分钟

关键要点

  • 由于向敏捷转型,软件架构图的使用规模已经大幅缩减。即使有在使用软件架构图,它们往往也混淆不清。
  • C4 模型由一系列分层的软件架构图组成,这些架构图用于描述上下文、容器、组件和代码。C4 图的层次结构提供了不同的抽象级别,每种抽象级别都与不同的受众有关。
  • 为了避免出现含糊不清的情况,可以在图中包含足够数量的文本和关键的图例。

软件架构图是一种非常好的表达方式,可以用它们来表达你将如何构建一个软件系统(预先设计)或者现有的软件系统是如何工作的(回顾文档、知识分享和学习)。

然而,你所看到的大多数软件架构图很可能只是由混乱的框和线组成。敏捷软件开发宣言的一个副作用就是让很多团队停止或缩减了他们的图表和文档工作,包括使用UML。

现在,这些团队倾向于依靠他们在白板上绘制的临时图表,或者使用通用的图表工具(如微软的Visio)。Ionut Balosin 在去年写了一篇叫作“软件架构图的艺术”的文章,他在文章中描述了一些常见问题,这些问题与不可理解的符号和不明确的语义有关。

含糊不清的软件架构图容易导致误解,这可能会拖慢一个优秀团队的前进步伐。在我们的行业中,我们真的应该努力创建出更好的软件架构图。多年来,我自己参与软件开发,并与世界各地的团队合作,基于这些经验,我建立了一个称之为“C4 模型”的东西。C4 代表上下文(Context)、容器(Container)、组件(Component)代码(Code)——一系列分层的图表,可以用这些图表来描述不同缩放级别的软件架构,每种图表都适用于不同的受众。可以将其视为代码的谷歌地图。

要为你的代码创建地图,首先需要一组通用的抽象来创建一种无处不在的语言,用来描述软件系统的静态结构。C4 模型使用容器(应用程序、数据存储、微服务等)、组件代码来描述一个软件系统的静态结构。它还考虑到使用软件系统的人。

第1 层:系统上下文

第1 层是系统上下文图,它显示了你正在构建的软件系统,以及系统与用户及其他软件系统之间的关系。以下是一个系统上下文图的示例,描述了一个互联网银行系统的系统上下文:

银行的个人客户使用互联网银行系统查看有关银行账户的信息并进行支付。互联网银行系统使用银行现有的大型机银行系统来执行此操作,并使用银行现有的电子邮件系统向客户发送电子邮件。图中的颜色表示哪些软件系统已经存在(灰色)以及待构建的系统(蓝色)。

第2 层:容器

第2 层是一个容器图,将软件系统放大,显示组成该软件系统的容器(应用程序、数据存储、微服务等)。技术决策也是该图的关键部分。以下是互联网银行系统的容器图示例。它显示了互联网银行系统(虚线框)由五个容器组成:服务器端Web 应用程序、客户端单页面应用程序、移动应用程序、服务器端API 应用程序和数据库。

Web 应用程序是一个 Java/Spring MVC Web 应用程序,它仅提供静态内容(HTML、CSS 和 JavaScript),包括组成单页应用程序的内容。单页面应用程序是一个运行在客户网络浏览器中的 Angular 应用程序,提供所有的网上银行功能。或者,客户可以使用跨平台 Xamarin 移动应用程序访问互联网银行的部分功能。单页应用程序和移动应用程序都调用 JSON/HTTPS API,这是由服务器端运行的另一个 Java/Spring MVC 应用程序提供的。API 应用程序从数据库中获取用户信息(关系数据库模式)。API 应用程序还使用专有的 XML/HTTPS 接口与现有的大型机银行系统进行通信,以获取有关银行账户或交易的信息。如果需要向客户发送电子邮件,API 应用程序还会调用现有的电子邮件系统。

第 3 层:组件

第 3 层是组件图,将单个容器放大,以显示其中的组件。这些组件映射到代码库中的真实抽象(例如一组代码)。下面是一个虚拟的网上银行系统的组件图示例,显示了 API 应用程序中的一些组件(而不是全部)。

两个Spring MVC REST 控制器为JSON/HTTPS API 提供访问点,每个控制器随后使用其他组件访问数据库和大型机银行系统中的数据。

第4 层:代码

最后,如果你确实想要,或者说有这个必要,可以放大个别组件,以显示该组件的实现方式。以下是一个虚拟的网上银行系统的UML 类图示例(部分),显示了组成MainframeBankingSystemFacade 组件的代码元素(接口和类)。

它表明该组件由很多类组成,实现细节直接反映了代码。我并不建议创建在这种详细程度的图表,有时候你可以直接从大多数IDE 中获取它们。

符号

C4 模型没有预定义任何特定的符号,你在这些示例图中看到的是一个个简单的符号,适用于白板、纸张、便签、索引卡片和各种图表工具。你也可以使用 UML 作为符号,并适当使用包、组件和原型。无论你使用哪种符号,我都会建议让每个元素都包含名称、元素类型(即“人”、“软件系统”,“容器”或“组件”)、技术选型(如果有的话),以及一些描述性文字。在图表中包含如此多的文本可能看起来很不寻常,但这些附加文本有助于消除软件架构图中通常会出现的不明确的表示。

即使符号对你来说是显而易见的,仍然要确保为这些符号提供图例。图例中应该包括颜色、形状、首字母缩略词、线条样式、边框、尺寸等。理想情况下,符号应该在每个细节层次上保持一致。下面是前面显示的容器图的图例。

最后,不要忘记了标题,它应该出现在每个图表上,以明确地描述每个图表的类型和范围(例如,“网上银行系统的系统上下文图表”)。

更多信息

C4 模型是一种在不同抽象层次上交流软件架构的简单方法,可以向不同的受众讲述不同的故事。这也是向软件开发团队介绍(通常是重新引入)严谨和轻量级建模的一种方式。有关 C4 模型的更多信息,以及补充图(运行时和部署)的示例、符号清单、常见问题解答、会议讲座视频和工具选项,请参阅 c4model.com

关于作者

Simon Brown 是一位专门从事软件架构的独立顾问,也是“Software Architecture for Developers”(面向开发人员的软件架构、技术领导力和敏捷性平衡的指南)的作者。他还是 C4 软件架构模型的创建者,这是一种创建代码映射的简单方法。Simon 在国际软件开发会议上经常发表演讲,并在世界各地旅行,以帮助组织可视化和记录他们的软件架构。

查看英文原文 The C4 Model for Software Architecture

2018 年 6 月 30 日 15:44178601
用户头像

发布了 731 篇内容, 共 402.2 次阅读, 收获喜欢 1958 次。

关注

评论 4 条评论

发布
用户头像
2021 年 09 月 07 日 10:52
回复
用户头像
就很nice,那么有推荐的画图软件吗,最好是在线的,哈哈~
2020 年 05 月 06 日 09:28
回复
http://c4model.com/ 里面最下方有工具介绍的哦。我是基于plantuml在vscode中实现了C4样式
2020 年 05 月 15 日 06:33
回复
2020 年 06 月 08 日 09:55
回复
没有更多了
发现更多内容

阿里云视觉智能开放平台离线人脸识别SDK开启邀测啦

夏夜许游

人工智能 AI 人脸识别 离线包

mysql 查询执行过程

周杰伦本人

9月月更

阿里云视觉智能开放平台2D视频转3D视频开启邀测啦

夏夜许游

人工智能 AI 3D

MODBUS RTU 485 协议简要说明

矜辰所致

Modbus RS485 9月月更

华为云宣布全面建设全球初创生态,3年内赋能10000家高潜初创企业

华为云开发者联盟

云计算 创业 创新创业 企业号九月金秋榜

住宅代理IP在网络攻击中的作用

郑州埃文科技

代理IP 安全检测 撞库攻击

硬核!阿里P8自爆秋招面试核心手册,Github上获赞65.7K

Java学习爱好者

Java 程序员 面试 八股文 金九银十

【死磕JVM】用Arthas排查JVM内存 真爽!我从小用到大

Java快了!

Pipy + Sentinel 实现 Redis 的高可用

Flomesh

Service Mesh 服务网格

送你5个MindSpore算子使用经验

华为云开发者联盟

人工智能 算子 企业号九月金秋榜

FreeRTOS记录(十、FreeRTOS实现带 I2C 通讯的 ModbusRTU 协议从机实例)

矜辰所致

FreeRTOS 9月月更 ModbusRTU

心血来潮,手绘一张Spring学习思维,内容详细全面,秋招面试必看!

收到请回复

Java 云计算 开源 架构 编程语言

【HTML-CSS】小游戏--渣灰哥的愿望之砍砍渣灰

Sam9029

JavaScript HTML5, CSS3 9月月更

计算机网络——码元、波特

StackOverflow

编程 计算机网络 9月月更

Redis复制的实现

周杰伦本人

9月月更

现代数据栈如何降低数据平台的复杂度?

Kyligence

数据分析 云原生 指标中台 指标自动化

为超级品牌打造「上瘾算法」|Whale 帷幄发布全新 DAM & VAP 内容数字化产品

科技热闻

实操指南:如何为 SAST 工具设置误报基准?

SEAL软件供应链安全

应用安全 静态应用安全测试 SAST 应用安全测试 软件供应链安全

3D打印机打印模型的10大技巧

Dylan

3D模型

iofod - Echart 图表全支持

iofod jude

Java 前端 低代码

压测平台在全链路大促压测中的实践

得物技术

中间件 全链路压测 QPS 企业号九月金秋榜

阿里、腾讯、美团春招真题“惨遭”泄露,Github上标星66.3K

Java学习爱好者

Java 程序员 架构 面试 跳槽

资源使用率提高25%,成本降低90%,云函数是怎么做到的?

最新动态

数据库发展史2--数据仓库

阿里云情报局

数据库 数据仓库 叶正盛 玖章

论监控中事件管理的艺术

穿过生命散发芬芳

事件管理 9月月更

PSYNC 命令的实现

周杰伦本人

9月月更

阿里云视觉智能开放平台商品图智能生成开启邀测啦

夏夜许游

人工智能 AI 电商 图像分割

劲爆!阿里巴巴面试参考指南(嵩山版)开源分享,程序员面试必刷

Java学习爱好者

Java 程序员 面试 跳槽 金九银十

编译器优化:何为别名分析

华为云开发者联盟

开发 编译器 企业号九月金秋榜

用于软件架构的C4模型_架构_Simon Brown_InfoQ精选文章