C4
C4 可视化架构设计
软件系统架构设计的目标不在于设计本身,而在于架构设计意图的传达。图形化有助于在团队间进行高效的信息同步,但不同的图形化方式需要语义一致性和效率间实现平衡。
上面的四张地图就是想说明,当我们看待真实世界的“架构图”的时候,也是要不停的缩放,在每一个层次刻意忽略一些细节才能表达好当前抽象层次的信息。所以他类比着把架构也提出了四个抽象层次:
从上到下依次是系统
四张核心图
系统上下文图
如上图所示,这个图表达的是你所开发的系统和它的用户以及它所依赖的系统之间的关系。从这个图上我们已经看出来
那么在系统上下文图里,方块指代的是软件系统,蓝色的表示我们聚焦的系统,也就是我开发的系统(也可能是我分析的系统,取决于我是谁
容器图
当我们放大一个系统,就会看到容器,如上图所示,
组件图
当我们放大一个容器,我们就会看到组件,如上图所示。组件在这里面很好的把接口和它的实现类打包成一个概念来表达关系。我个人觉得有时候一些存在于代码中,但又不是接口的某些东西,比如
代码图
代码图没什么可说的,就是
以上就是
三张扩展图
架构设计设计要考虑的维度很多,仅四张核心图是不够的,所以作者又提供了三张扩展图,可以让我们关注更多的维度。
系统景观图
和它的直接关系,连一些间接相关的系统都会标示出来,那些系统的用户以及用户之间的关系也会标示出来,只是内部的用户会用灰色标记。
这个图有什么用呢?在我们分析一个企业的时候,我们需要一个工具帮助我们把一家公司给挖个底掉,做到完全穷尽,才能看到企业的全景图从而理解局部的正确定位以做好局部设计为全局优化服务。之前我试过以四色建模的红卡、事件风暴的事件两种工具教人去掌握这种能力,当学员是程序员的时候都无法快速掌握这种顺藤摸瓜的分析技巧,毕竟跟程序员的思维还是有些差异的。但是我用了系统景观图之后,学员毫不费力的就掌握了这种分析能力。所以我后来都是用这个图来教程序员探索企业的数字化全景图,效果极好,推荐给大家。
动态图
动态图不同于其他图都是表达静态关系的,它是用来表达动态关系的,也就是不同的元素之间是如何调用来完成一个业务的。所以动态图不仅仅在一个层面上可以工作,它在系统级、容器级和组件级都可以画,表达的目标是不一样的。
我之前曾经写过名为《像机器一样思考》的一系列文章,里面我也发明了类似的图,不同于他的关系线上标注的是调用的方法、函数,我更关注的是数据,使用效果也很好。
什么时候是用动态图呢?举个小例子,我之前做一个内部的小系统,只有一个有经验的工程师带着
部署图
前面的几张图都是站在开发的角度思考,但是一个没有充分思考过部署的架构很容易变成一个运维的灾难。所以作者提供了一个部署图。考虑到
图上最大的的实线框不同于虚线框,它表达的是数据中心,当你开始考虑异地载备的时候它就有了意义。数据的同步、实例的数量都会影响你部署图的内容。部署图基本都是容器级的,它会很好的表达出来容器到底部署了几个实例,部署在什么样的操作系统上,一个节点部署了几个容器之类,我们在实际使用中,发现需要考虑的信息太多,自己就抽象出了类似于亚马逊上实例规格的