C4 模型

摘要:
当我们使用C4模型来描述我们的软件架构时,我们可以不断放大并从宏观到细节具体描述架构。这也是C4车型给我们带来的巨大价值。在我们有了C4模型的方法论之后,当我们面对不同角色的人时,我们将清楚地知道应该宣讲哪个层面,应该关注哪个层面。这样,我们将在统一意识的层面上进行讨论,以实现意识的统一。

   前言

  世界上最难的两件事是:

  1. 把我的思想放进你的脑袋

  2. 把你的钱放进我的口袋  

  第二点我们不探讨,因为这是众所周知的,不信?过来试试:)  

  对于第一点,对我们程序员来说,其实也是我个人一直强调的,很多事情的成败,其实就在于掌舵人的思想层面是否认知是一致的,当我们对于一个事物的认知不在同一层面,就好比我们的划桨是不统一的,这是不能发挥最大的生产力。

  你碰到过吗?

  当我们进入一家新公司的时候,每个人都需要对公司的业务系统进行了解,当你不得不向别人解释系统是如何工作的,业务模块是如何串联的,子系统是如何各司其职的,特别是对于非技术人员来说,你会从代码开始解释吗?

  如果是这样的话,这将是最低效且会让人陷入无穷无尽的技术细节里面,如何清晰描述系统让不同人找到自己的关注点,将成为难题。

  通常我们会从宏观的架构设计上进行讲解,然而当我们在探讨架构设计的时候,每个人对架构的抽象层次理解都不一样,抽象这种东西,说起来好像存在,但是要具体描述乃至落笔下来,还是非常有难度的。

  所以我们需要的是:让程序员和业务人员在讨论系统时候,能有统一的维度和统一标准,这就像是领域驱动设计里面所提倡的统一语言,让所有人在统一的认识中有效的沟通。

  鉴于这样的背景,C4 model提出这样的概念来解决这个问题。

  C4 模型

  C4的理念是,具体把系统分为:System Context(上下文), Container(容器), Component(部件), Code(代码)这四层,每层代表着不同的视图架构,关注点也会不同,所以每层适用于不同的人员,我们会针对当前的人员的角色,找到共同的关注点(合适的层级)来统一认识,然后拓展话题。

C4 模型第1张

  当我们使用C4模型来描述自己的软件架构时,可以通过不停的放大,把架构从宏观到细节具体地描述出来。就好比我们看地图一样,总览(System Context)关注的是国家层面,然后到省(Container)的层面,由多个省来构成国家,再下一层,到市(Container),再到市是如何建设起来的(Code)。这四种不同的抽象层次的定义会让我们更容易固定住我们讨论的层次以及共同认识。

 C4 模型第2张

  我们来看一下每一层的具体含义。

  第一层 -  System Context

  在这一层,我们将不会关注细节,这里提供的是系统级别的总览关系图,这层的关注点应该是用户和系统的交互,而不是协议,技术点等一些具体的体现。所以它的使用人群是非技术人员,这里面描述的是系统级别的交互,谁使用。

C4 模型第3张

  在这里,我们可以理解这是一个可供终端用户使用的完整系统(或者多个系统)的描述和专注于该层的使用人员,这里的一个系统可由一个或者多个服务(进程)组成,能完成我们业务的服务组合。所以看到我们用户直接面对的是可用的系统,而一些邮件和权限系统,则属于子系统。

  在这里的一些特定技术术语需要澄清一下:一个系统可由多个服务(微服务)组成,也可只有一个服务组成(邮件系统很可能只有一个邮件的收发服务)。

  需要特别注意的是,在跟别人探讨这层的时候,尽可能不要引入技术术语,因为这层更多的是使用人员关注的,大家的认知应该是在对系统的正常理解。

  第二层 - Container

  这一层是上一层Context的继续(我们这里选择的是用业务系统这个系统作为例子),是我们将各个System Context放大(Zoom in)的效果,我们将会看到一个技术栈以及各模块的一个职责和依赖。

   C4 模型第4张

  这层是给具有技术背景的人员看,这里面描述的是进程级别的应用,这是可直接部署和运行的,通过这层,我们将可以看清软件整体形态以及职责描述。

  这里的Container也可以理解为容器,因为我们的应用进程也是按容器为单位部署的。

  第三层 - Component

   这一层是Container层的继续放大,这里将看到服务的具体组成,如我们的订单服务包含哪些职责的类

C4 模型第5张

  我们可以看到,这一层是给开发人员看,这里描述的是系统组成部件、部件之间的层级关系和依赖。

  这层的Component,可以理解为java里面的包或者c#里面的程序集,这里描述的是内部的包/程序集相互引用(调用)关系以及包对外部系统的程序的依赖

  第四层 - Code

  这一层是持续将Component放大的效果(借用一下官网的类图:))。

 C4 模型第6张

  这一层的使用对象是开发人员,这里描述的是基于UML等图形来描述实现的技术细节,直接反映了代码层面。

  找到共同语言

  好了,当我们把整个系统通过通过C4 模型设计把不同层次的抽象软件架构描述了出来,我们可以找到各自所关心的层次进行快乐的交流了。

  什么?你想给刚来的产品经理讲Component级别的架构?不,你不想,你也不能想,因为他并不关心这个,你能讲的,就是基于Context级别,讲述我们公司的整个产品体系是如何运行以及关联依赖的。

  所以,回到我们的前言:让所有人在统一的认识中有效的沟通。这让我们在探讨之前,先找好各自关心的层次,然后再进行交流。这也是C4 模型给我们带来的巨大价值。

  我们如何落地?

  说了那么多概念,可以来点干货了,如何动手把脑袋中的架构展示出来?

  PlantUML

  什么是PlantUML? PlantUml是一个支持快速绘制的开源项目,其定义了一套完整的语言,通过文字、代码等工具用于实现UML关系图的描述。

  通过PlantUML,我们可以轻松通过代码形式画出自己想要的图形。 

  这里采用一个流程图作为例子: 

@startuml
用户 -> 认证中心: 登录操作
认证中心 -> 缓存: 存放(key=token+ip,value=token)token

用户 <- 认证中心 : 认证成功返回token
用户 -> 认证中心: 下次访问头部携带token认证
认证中心 <- 缓存: key=token+ip获取token
其他服务 <- 认证中心: 存在且校验成功则跳转到用户请求的其他服务
其他服务 -> 用户: 信息
@enduml

  C4 模型第7张

  PlantUML不仅仅能画出C4 模型架构,还能轻松画出常用的UML图,以及通过安装插件,实现draw.io ,xmind等插件的图形绘画。

  使用PlantUML刻画C4

   在VSCode中下载PlantUML插件,然后在GitHub上搜索一些好用的PlantUML开源库,直接代码形式画图吧。

C4 模型第8张

   补充个人上面图形的PlantUML源码:)

C4 模型第9张

   总结

  软件架构图是一种非常好的表达方式,可以用它们来表达你将如何构建一个软件系统或者现有的软件系统是如何工作的,而C4 模型则能很好的解决这个问题,它是由一系列分层的软件架构图组成,这些架构图用于描述不同层次的不同的抽象,每层的抽象都会有不同的适用人群。

  当我们拥有了C4 模型的方法论之后,面对不同角色人员,我们将清楚的知道,应该宣讲哪层以及该把关注点放在哪层,这样我们将会在统一的意识层面上探讨,做到意识上的统一。

免责声明:文章转载自《C4 模型》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python购物车程序Pointer Lock API(1/3):Pointer Lock 的总体认识下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【转】SQL还原数据库后孤立用户问题处理 还原数据库无法登录 Alec

所谓孤立帐户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录 孤立帐户的产生一般是一下两种: 1.将备份的数据库在其它机器上还原; 2.重装系统或SQL SERVER之后只还原了用户库 解决方法是使用sp_change_users_login来修复...

三层架构和MVC的区别

一、三层架构 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也...

转: 从单体应用 -&amp;gt; SOA--&amp;gt; 微服务 ,服务治理 [熔断,限流,降级,服务恢复,服务容错,监控等等]---&amp;gt; RPC ---&amp;gt; 下一代技术[Service Mesh]

单体式应用程序 与微服务相对的另一个概念是传统的「单体式应用程序」( Monolithic application ),单体式应用内部包含了所有需要的服务。而且各个服务功能模块有很强的耦合性,也就是相互依赖彼此,很难拆分和扩容。 说在做的各位都写过单体程序,大家都没意见吧?给大家举个栗子,刚开始写代码你写的helloworld程序就是单体程序,一个程序包含...

大型网站技术架构

一、使用缓存减轻数据库的压力,提升网站性能。二八定律,80%的业务访问集中在20%的数据上。 1.缓存在应用服务器上的本地缓存。(Session) 2.缓存在专门的分布式缓存服务器上的远程缓存。可以采用集群的方式,理论上可以做到无限扩充。(Redis、memcached等) 二、使用服务器集群改善网站的并发处理能力。 1.单一服务器无法满足需求时,不要企...

饿了么技术往事

小结: 1、从技术骨干再到技术团队负责人这一转变过程中,很容易被忽略的就是团队的人员结构。 2、领域职责没有收口,带来很多一致性问题。 领域边界的分歧 3、 Leader的个人能力,决定了他(她)是这个团队的地基还是天花板。 4、 业务领域拆分、基础设施和业务系统分别建设后,给业务快速发展解绑了。但是包括稳定性在内的一系列挑战依然需要面对:   基础设施...

MySQL高可用集群方案

一、Mysql高可用解决方案 方案一:共享存储 一般共享存储采用比较多的是 SAN/NAS 方案。 方案二:操作系统实时数据块复制 这个方案的典型场景是 DRBD,DRBD架构(MySQL+DRBD+Heartbeat) 方案三:主从复制架构 主从复制(一主多从) MMM架构(双主多从) MHA架构(多主多从) 方案四:数据库高可用架构 这种方式比较经典的...