在软件开发的流程中, 软件架构图是重要的软件文档,软件架构图包含有多个层级,最常见的,有软件的整体架构和组件、类等图。
但在实际的开发中, 特别是敏捷开发中,对于软件架构图文档往往出现以下状况:
这一方面又有一部分原因是绘制或调整软件架构图比较麻烦, 对开发者而言,最熟悉的是代码, 于是慢慢就有了由代码产生图的方式和实现。于此同时,需要定义哪些 软件架构图有就有人进行了整理, 这也就是C4产生的背景。
此外,在使用IDE以及AI协助产生Code的基础上,使用Code产生架构图也就有了很大的优势。
C4模型(Context, Container, Component, Code 模型)是一种用于软件系统的图形表示的框架。C4模型由 Simon Brown 提出,主要用来解决软件架构文档的各种问题。
C4 就是4个C开头的单词,分别代表四种类型的图:
这四种类型的图, 分别代表了四个层次的视角:
Context: 显示系统与其环境之间的交互,如用户、系统和服务等。在这一层,系统被视为一个黑盒子。
Container: 揭示系统的高级架构风格,并描绘出主要的技术选型。在这一层,系统被分解成一些相互交互的容器,如 Web 服务器、桌面应用、数据库、移动应用、微服务等。
Component: 进一步细分容器为一系列的组件,并描述他们之间的交互。在这一层,将清楚地知道每个组件的职责,并能知道它们之间的通信与交互方式。
Code: 这是最底层的视角,对系统进行最详细的描述。它通常通过 UML 类图或者其他的代码级视图来展示。
每一层都为软件系统的某个方面提供了更多的细节。在很多情况下,你并不需要使用全部的四个级别;你可以根据需要选择适合自己的层数。C4模型的主要目标是帮助软件开发团队描述和理解复杂的软件架构,并且与利益相关人进行有效沟通。
Context Diagram :显示构建的软件系统,以及系统与用户及其他软件系统之间的关系。
举例来看, 以互联网银行系统的系统上下文为例,在环境中的关系是:
blob:https://www.kancloud.cn/fa954884-1027-4679-8e12-ba2ead87143b
图例对应的含义:
将软件系统放大,显示组成该软件系统的容器(应用程序、数据存储、微服务等)。
技术决策也是该图的关键部分。
组件图,将单个容器放大,以显示其中的组件。这些组件映射到代码库中的真实抽象(例如一组代码)
以虚拟的网上银行系统的组件图示例,显示了 API 应用程序中的一些组件(而不是全部)。
这一层就很容易理解, 就是UML。
虚拟的网上银行系统的UML 类图示例(部分),显示了组成MainframeBankingSystemFacade 组件的代码元素(接口和类)
C4 模型没有预定义任何特定的符号,上面的示例图中看到的是一个个简单的符号,适用于白板、纸张、便签、索引卡片和各种图表工具。
可以使用 UML 作为符号,并适当使用包、组件和原型。无论使用哪种符号,建议让每个元素都包含名称、元素类型(即“人”、“软件系统”,“容器”或“组件”)、技术选型(如果有的话),以及一些描述性文字。在图表中包含如此多的文本可能看起来很不寻常,但这些附加文本有助于消除软件架构图中通常会出现的不明确的表示。
产生C4 的工具也有不少, 这里介绍两个:
此外, 使用ChatGPT等AI也可以直接产生C4的Code。
Structurizr 是一个动态交互的、模型驱动的软件架构图形化工具。这个工具旨在创造、分享和发布软件架构图。
Simon Brown, C4模型的创始人开发了Structurizr。
Structurizr 提供了一个在线版本,也提供了本地部署的版本(Structurizr Lite)让你可以在本地机器上运行。该工具可以创建交互式和动态的软件架构图,不同于静态的图像或是手绘图。在线地址: https://structurizr.com/dsl
Structurizr 的一些主要特性包括:
动态和交互的视图:与只能展示静态图像的工具不同,Structurizr 允许用户查看各种视图,通过点击和拖拽图形元素来探索软件架构。
DSLs 和 API:Structurizr 提供了一种领域特定语言 (DSL),用于定义和描述软件架构模型。同时也提供了API让你使用你首选的编程语言来创建模型。
C4模型支持:Structurizr 支持 C4 模型,这是一种常用的、易理解的软件架构可视化方法。
集成和导出选项:Structurizr 可以导出到多种格式,包括 PlantUML、Web Sequence Diagrams 和 DOT (Graphviz),并且支持与常见的技术和工具(如 Git, PlantUML 和 Mermaid)进行集成。
Simon Brown是一位软件架构师,他也是软件架构可视化工具 Structurizr 的创始人和开发者。他特别强调技术领导应对软件架构的理解和交流,以策略和战术设计元素为基础,进一步在开发团队和项目中实施架构规划和应用软件架构原则。
Simon Brown 还创建了 C4(Context, Container, Component, Code)模型,这是用于可视化软件架构的一种方法。C4 模型的目标是帮助开发团队在不同的细节层次上描述和理解软件架构,并更有效地与其他相关人员(如业务领导者和项目经理)进行沟通。
除此之外,Simon Brown 还是一位公开演讲者和教师,他的工作领域跨越软件开发生命周期的许多方面,包括代码质量,技术领导,和软件架构等课题。
更多信息,您可以访问他的个人网站:http://www.simonbrown.je/