使用代码产生标准的软件架构图之C4

news2025/4/4 3:47:49

在软件开发的流程中, 软件架构图是重要的软件文档,软件架构图包含有多个层级,最常见的,有软件的整体架构和组件、类等图。

  • 整体架构可能使用PPT或者一些绘图工具Visio来绘制
  • 组件、类等图有UML的标准, 也可以使用Visio 来绘制

但在实际的开发中, 特别是敏捷开发中,对于软件架构图文档往往出现以下状况:

  • 软件架构图混乱
  • 敏捷开发的副作用让很多团队停止或缩减了图表

这一方面又有一部分原因是绘制或调整软件架构图比较麻烦, 对开发者而言,最熟悉的是代码, 于是慢慢就有了由代码产生图的方式和实现。于此同时,需要定义哪些 软件架构图有就有人进行了整理, 这也就是C4产生的背景。
此外,在使用IDE以及AI协助产生Code的基础上,使用Code产生架构图也就有了很大的优势。

C4 是什么?

C4模型(Context, Container, Component, Code 模型)是一种用于软件系统的图形表示的框架。C4模型由 Simon Brown 提出,主要用来解决软件架构文档的各种问题。

C4的内容是什么?

C4 就是4个C开头的单词,分别代表四种类型的图:

  1. Context Diagram:背景图,系统如何融入环境(包括用户和其他系统)
  2. Container Diagram:容器图,系统如何由容器(不是容器技术,应用程序 or 存储)组成
  3. Compoment Diagram:组件图,展示特定容器的实现
  4. Code Diagram:代码图,使用UML展示

这四种类型的图, 分别代表了四个层次的视角:

  1. Context: 显示系统与其环境之间的交互,如用户、系统和服务等。在这一层,系统被视为一个黑盒子。

  2. Container: 揭示系统的高级架构风格,并描绘出主要的技术选型。在这一层,系统被分解成一些相互交互的容器,如 Web 服务器、桌面应用、数据库、移动应用、微服务等。

  3. Component: 进一步细分容器为一系列的组件,并描述他们之间的交互。在这一层,将清楚地知道每个组件的职责,并能知道它们之间的通信与交互方式。

  4. Code: 这是最底层的视角,对系统进行最详细的描述。它通常通过 UML 类图或者其他的代码级视图来展示。

每一层都为软件系统的某个方面提供了更多的细节。在很多情况下,你并不需要使用全部的四个级别;你可以根据需要选择适合自己的层数。C4模型的主要目标是帮助软件开发团队描述和理解复杂的软件架构,并且与利益相关人进行有效沟通。
在这里插入图片描述

第1层.Context Diagram 系统上下文图

Context Diagram :显示构建的软件系统,以及系统与用户及其他软件系统之间的关系。

举例来看, 以互联网银行系统的系统上下文为例,在环境中的关系是:
blob:https://www.kancloud.cn/fa954884-1027-4679-8e12-ba2ead87143b
图例对应的含义:

在这里插入图片描述

  • 灰色方块:代表已经存在的系统
  • 红色方块: 待构建的系统

第2层. Container Diagram 容器图

将软件系统放大,显示组成该软件系统的容器(应用程序、数据存储、微服务等)。
技术决策也是该图的关键部分。

同样以互联网银行系统为例:
在这里插入图片描述

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

第3层: Compoment Diagram 组件图

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

在这里插入图片描述

在这里插入图片描述

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

第4层 : Code Diagram 代码图

这一层就很容易理解, 就是UML。
虚拟的网上银行系统的UML 类图示例(部分),显示了组成MainframeBankingSystemFacade 组件的代码元素(接口和类)

在这里插入图片描述

C4的符号

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

在这里插入图片描述

如何代码产C4

产生C4 的工具也有不少, 这里介绍两个:

  • Structurizr :C4的官方提供了一个工具,是一个Java的war, 下载后可以在本地进行绘制。 有免费版本, 也有收费。但是目前没有IDE与其整合。
  • C4-PlantUML: 基于PlantUML之上提供了C4绘制的代码语言, VS Code以及其他IDE都有相关的插件, 在IDE中直接编写Code就可以实时看到图形。

此外, 使用ChatGPT等AI也可以直接产生C4的Code。

关于 Structurizr

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)进行集成。

关于C4 的创建人 Simon Brown

Simon Brown是一位软件架构师,他也是软件架构可视化工具 Structurizr 的创始人和开发者。他特别强调技术领导应对软件架构的理解和交流,以策略和战术设计元素为基础,进一步在开发团队和项目中实施架构规划和应用软件架构原则。

Simon Brown 还创建了 C4(Context, Container, Component, Code)模型,这是用于可视化软件架构的一种方法。C4 模型的目标是帮助开发团队在不同的细节层次上描述和理解软件架构,并更有效地与其他相关人员(如业务领导者和项目经理)进行沟通。

除此之外,Simon Brown 还是一位公开演讲者和教师,他的工作领域跨越软件开发生命周期的许多方面,包括代码质量,技术领导,和软件架构等课题。

更多信息,您可以访问他的个人网站:http://www.simonbrown.je/

参考:

  • https://c4model.com/


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1011601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Android知识笔记】进程通信(二)

一、Binder对象是如何跨进程传递的 binder传递有哪些方式?binder在传递过程中是怎么存储的?binder对象序列化和反序列化过程?binder对象传递过程中驱动层做了什么?总结 Binder 对象的跨进程传递主要靠 Parcel 的两个关键方法 writeStrongBinder() 和

【数据结构】—堆排序以及TOP-K问题究极详解(含C语言实现)

食用指南:本文在有C基础的情况下食用更佳 🔥这就不得不推荐此专栏了:C语言 ♈️今日夜电波:ルミネセンス—今泉愛夏 1:01 ━━━━━━️💟──────── 5:05 …

[刷题记录]牛客面试笔刷TOP101(一)

牛客笔试算法必刷TOP101系列,每日更新中~(主要是记录自己的刷题,所以描述的可能不是很清楚 但如果刚好能帮助到你就更好了) 后续后头复习的时候,记得是看正解啊,别对着错的例子傻傻看了... 目录 1.合并有序链表2023.9.3 2.链表是否有环2023.9.4 3.判断链表中环的入口点 …

学Python的漫画漫步进阶 -- 第三步

学Python的漫画漫步进阶 -- 第三步 三、数字类型的数据3.1 Python中的数据类型3.2 整数类型3.3 浮点类型3.4 复数类型3.5 布尔类型3.6 数字类型的相互转换3.6.1 隐式类型的转换3.6.2 显式类型的转换 3.7 练一练3.8 数字类型的总结全部16步完成后 ,后续就是介绍项目实…

走进甄云,探寻SRM独角兽成功背后的故事

随着科技的快速发展和全球商业环境的不断变化,中国企业对灵活性、创新性、全球化和效率的需求是迫切的,数字化转型已经成为企业生存和发展的关键因素,对企业具有重要意义,是组织生存和发展的必然趋势。数字化转型涉及整个组织、多…

PMP-项目规划过程组的重要性

一、什么是项目规划过程组 规划过程组包括明确项目全部范围、定义和优化目标,并为实现目标制定行动方案的一组过程。规划过程组中的过程制定项目管理计划的组成部分,以及用于执行项目的项目文件。取决于项目本身的性质,可能需要通过多轮反馈来…

片上网络(1)概述

前言 NoC:On-Chip Networks,片上网络。 由于多核乃至众核时代的到来,用于连接它们的可扩展、低延迟、大带宽的通信结构变得至关重要。 在核心较少时,总线Bus和矩阵/交叉开关Crossbar是主要的互联结构。总线可以提供较低的传输延迟…

云原生Kubernetes:pod基础与配置

目录 一、理论 1.pod 2.pod容器分类 3.镜像拉取策略 4.pod 的重启策略 二、实验 1.Pod容器的分类 2.镜像拉取策略 三、问题 1.apiVersion 报错 2.pod v1版本资源未注册 3.格式错误 4.取行显示指定pod信息 四、总结 一、理论 1.pod (1) 概念 Pod是kubernetes中…

pgzrun 拼图游戏制作过程详解(4,5)

4. 将小拼图位置随机打乱 建立swap_Square(i,j)坐标互换函数 将Gird[i]和Gird[j] 中的小拼图信息进行互换 def swap_Square(i,j): # 两个拼图的位置互换temp_posGird[i].posGird[i].posGird[j].posGird[j].postemp_pos 导入随机数模块 import random 随机抽取…

ruoyi-nbcio移植过程中的一些问题记录

1、打包去掉测试出现 Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test 错误 在pom.xml里增加下面 去掉测试 <!--添加配置跳过测试--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId…

2023.05.27系统分析师考试案例分析及解析

案例分析真题1 阅读以下关于软件系统分析与建模的叙述&#xff0c;在纸上回答问题1至3. 说明: 某软件公司拟开发一套汽车租赁系统&#xff0c;科学安全和方便的管理租赁公司的各项业务&#xff0c;提高公司效率&#xff0c;提升利率。注册用户在使用系统镜像车辆预约时需执行…

利用Windows搭建Emby媒体库服务器,轻松实现无公网IP的远程访问

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中&#xff0c;观看视频绝对是主力应用场景之一&…

css+js:实现tab切换线条跟随效果

目录 实现效果原理解析代码实现 实现效果 使用css和js实现一个tab切换的效果 原理解析 如上图 红色框框代表盒子,总宽度记作 totalWidth绿色框框代表每一项,宽度记作itemWidth深蓝色框框代表的是下划线,宽度记作activeWitdh 那么我们可以得到线的左边距是每一项的左边距加上…

通讯网关软件002——利用CommGate X2HTTP-U实现HTTP访问OPC UA Server

本文介绍利用CommGate X2HTTP-U实现HTTP访问OPC UA Server。CommGate X2HTTP是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;实现上位机通过HTTP来获取OPC UA Server的数据。 【解决方案】设置网关机…

c++ 中的函数指针

以下图片演示了c中函数指针的用法。如下图可见&#xff0c;把函数地址赋值给函数指针&#xff0c;用函数名或者函数名的地址&#xff0c;都可以&#xff0c;c编译器不报错。即 ptr f 和 ptr &f 都对。但准确的话&#xff0c;函数名就是地址&#xff0c;在编译时候&#x…

19 视图定义 union 是根据第一个 select 字段列表顺序,来进行 merge 的

前言 这个问题主要是 在之前存在这样的一个问题, 在生产环境上面 按照 我的直观理解, mysql 应该是根据 key 进行 merge, 所以 select 的顺序应该是 “不重要”??, 但是 结果我理解错了 然后 线上的查询也出现了问题, 发现很奇怪的问题, 明明 key01 列 是 id, 但是有一部…

【Linux问题】This account is currently not available.

在切换mysql用户时候出现下面问题 Last login: Fri Sep 15 09:32:46 CST 2023 on pts/0 This account is currently not available.查看 mysql用户信息 cat /etc/passwd | grep mysql他是 mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin把 /sbin /nologin 改成 /b…

使用阿里PAI DSW部署Stable Diffusion WebUI

进入到网址https://pai.console.aliyun.com/里边。 点击创建实例。 把实例名称填写好&#xff0c;选择GPU规格&#xff0c;然后选择实例名称是ecs.gn6v-c8g1.2xlarge。 选择stable-diffusion-webui-env:pytorch1.13-gpu-py310-cu117-ubuntu22.04&#xff0c;然后点击下一步。…

云原生Kubernetes:K8S集群使用带凭证的harbor仓库

目录 一、理论 1.部署harbor 创建私有项目&#xff0c;使用凭证登录 二、实验 1.部署harbor 创建私有项目&#xff0c;使用凭证登录 三、问题 1.harbor页面无法打开 2.生成harbor 登录凭据资源清单报错 3.tomcat-deployment 资源生成报错 一、理论 1.部署harbor 创建私…

CSV文件打开乱码解决方案

思路 借助第三方软件转码即可。 案例 打开CSV文件显示如下&#xff1a; 导入到python中&#xff0c;借助pandas文件读取 另存为csv文件格式即可 代码如下&#xff1a; import pandas as pd df pd.read_csv(rD:\BaiduNetdiskDownload\csv&xlsx版数据\城市产业创新指数…