01-C4 model

官方文档:https://c4model.com/#SystemContextDiagram

概述

最近在设计系统中,需要一种方式来构建对于当前系统的理解和细化,UML是我一下子映入脑海的方式,但是很久不再接触了,刚好在前段时间看到关于C4model相关文章,记录一下。

为什么画架构图还需要一个模型呢?当我们看一个软件系统时,不同的人或角色会有不同的视角,所看到的也会是不同的方面。BA/PO所看到的软件系统可能是业务面,架构师所看到的可能是技术架构,而开发者可能看到的是实现细节。而在不同的场合,对不同的受众应该展示的方面应该是不同的,这样更便于描述和沟通软件架构。

架构图的主要功能是从各个角度和各个层次去描述系统的功能,主要是从宏观到微观的描述。C4 Model也是提供图形从不同的层次去描述我们的系统。主要的优势是C4 Model提供很少的抽象图形要素和图类型来描述系统,使得各个系统参与者都能很快理解系统的功能。这些图从层级上来看都是缩放的,就行谷歌地图一样

为了构建实际系统的抽象。C4 Model对于系统的描述提供了四个抽象层次:

这个抽象层次里面包含5个要素

  • Software System:软件系统最高的抽象层次,描述了交付给用户完成用户所需功能的系统。
  • Person:使用系统的人或者角色
  • Container: 容器是独立运行一些代码和数据,组合起来完成系统功能的要素。一个容器可以是Server-side web application、Client-side web application、Client-side desktop application、Mobile app、Server-side console application、Microservice、Database、Blob or content store、File system、Shell script等。
  • Component:组件一组相关功能的封装,对外提供良好的接口。

基于这四个层次的抽象,C4 Model由4张核心图(Context, Containers, Components, Code)和3张附加图组成

四张核心图

4张核心图分别为系统上下文图(Context)、容器图(Container)、组件图(Component)、代码图(Code),代码图是实际的类实现,可选。

系统上下文图

Context即系统上下文,这是最高Level的架构图,不暴露系统的内部细节,所展现的是:

  • 本系统的用户是谁
  • 与哪些外部系统有交互

系统上下文图可以说是一个系统的外观,不是站在系统内部,而是抽离出来,将本系统看作一个黑盒,站在系统外部来看,来展现与用户、外部系统间的关系。

细节在这里并不重要,因为这是显示系统全景图的缩小视图。重点应该放在用户和软件系统上,而不是技术和其他实现细节。这是可以向所有人展示的架构图, 包括技术人员与非技术人员

在系统上下文图里,方块指代的是软件系统,蓝色表示我们关注的系统(位于中心),灰色表示我们直接依赖的系统或者依赖我们的系统,虚线框一般用于用于聚合相关元素。

容器图

当我们理解了当前关注的系统在整个IT环境中的地位的时候,需要将当前系统放大,观察里面的内部结构,放大后就会看到容器,如上图所示,C4模型认为系统是由容器组成的。

这里容器的概念,有别于Docker容器,指的是在一个软件系统中可独立部署/独立运行的单元。可以是服务器端 Web 应用、单页应用、桌面应用、移动应用、数据库等。

如果说系统上下文图将本系统看作一个黑盒,那么容器图则是把这个黑盒打开,这个时候看到的是系统内部的所有容器,及各个容器盘根错节的交互关系,可以展现容器的主要技术栈,容器间如何通信。这是一个以技术为重点的简单图表,对软件开发人员、支持和运维人员都很有用。

组件图

继续放大容器,可以看到每个容器里有哪些组件组成,组件的职责是什么,组件是如何交互的。组件主要是相关功能的聚合,提供对外的接口

代码图

代码层则是放大每个组件以显示它是如何作为代码实现的;使用 UML 类图、实体关系图等。 理想情况下,该图将使用工具(例如 IDE 或 UML 建模工具)自动生成,您应该考虑仅显示那些想要展示的属性和方法。

三张扩展图

核心图让我理解了系统静态架构,三张扩展图,可以让我们关注更多的维度。

系统景观图

系统景观图是比系统上下文图更丰富的系统级别的表达。不像上下文图只关注聚焦系统和它的直接关系,连一些间接相关的系统都会标示出来,包括那些外部系统相关的用户。系统景观图的意义在于从企业的整个IT架构来看待当前要构建的系统的功能和价值。

动态图

动态图不同于上面所有静态图的表达,它表达的系统的某个运行态,这个运行态中完成了一个用户的场景或者功能。所以一般有步骤,有顺序。而且可以在各个层级去描述这个动态图。

部署图

部署图主要描述系统在容器级别是如何实际部署到物理基础设施中的。

图形符号(Notation)如何描述

C4模型没有规定任何特殊的图形。所以简单的图形就可以描述,如下

我们可以使用颜色和形状是的图形描述更加清晰。所有图形都需要是自描述的,但所有图表都应有一图例,以使符号明确。

下面有一些关于图形符号的实践推荐

  • 每张图都应该有个标题标明图类型和范围
  • 图中需要有个图例来解释所使用的图形符号(比例 形状、颜色、边框样式等)
  • 图形里面的缩写所有受众都能理解

元素

  • 所有元素的类型需要被明确指定
  • 所有元素都需要一个简单描述,描述其核心职能
  • 所有的容器和组件都需要明确的指定技术

关系

  • 所有关系线都只表示单向的关系
  • 每一行都应该加上标签,标签应该与关系的方向和意图保持一致(例如依赖关系或数据流)。尽量把标签写得具体些,最好避免使用“Uses”这样的单字。
  • 容器之间的关系(通常代表进程间通信)应该有明确标记的技术/协议。

C4的工具

参考:


01-C4 model
https://flepeng.github.io/架构-01-C4-model/
作者
Lepeng
发布于
2023年2月1日
许可协议