C4 模型学习

1. 引子

软件架构图是一种非常友好的表达方式,可以用来表述你将如何构建一个软件系统(预先设计)或者现有的软件系统是如何工作的(回顾文档、知识分享)。

现实中存在一些问题:

  1. 很多软件架构图是由混乱的框和线组成的,具体问题可以参见文章:软件架构图的艺术(主要是不可理解的符号和不明确的语义),含混不清的软件结构图容易导致误解。
  2. 敏捷开发让很多团队停止、缩减他们的图表和文档工作(包括使用UML),可能只在白板上绘制临时表,或者使用通用的图表工具(如:Visio)。

为了解决这些问题,提出了一个C4 模型 的东西,C4的含义如下:

  • Context:上下文
  • Container:容器
  • Component:组件
  • Code:代码

构成四个层次图表,通过这些图表来描述不同缩放级别的软件架构,每个图表适用于不同的受众。

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

img

2. 怎么做

C4 模型使用容器(应用程序、数据存储、微服务等)、组件和代码来描述一个软件的静态结构。结构如下:

1. 系统上下文

第一层是系统上下文图,展示正在构建的软件系统,使用该系统的用户,与该系统有关联的其他软件系统。下图是一个互联网银行系统的系统上下文:

银行客户使用互联网银行系统来查看自己的账户信息并进行支付,互联网银行使用已有的大型机银行系统来执行此操作,并使用银行现有的电子邮件系统向客户发送电子邮件。图中:灰色表示软件系统已经存在,蓝色表示待建设的软件系统。

2. 容器

第二层是容器层,将软件系统放大,显示组成该软件系统的容器(应用程序、数据存储、微服务等)。技术决策也是该图的关键部分。下图是互联网银行的容器图实例。显示了互联网银行系统(虚线框)由5个容器组成:服务器端web应用程序、客户端单页面应用程序、移动应用程序、服务器端API应用程序和数据库。

  • Web App: 是一个Java/Spring MVC Web应用程序,他提供静态内容(HTML、CSS、JavaScript)和组成单页面应用的内容。
  • 单页面应用:是一个运行在客户浏览器中的Angular应用程序,提供网上银行的全部功能。
  • 移动App:构建在 Xamarin 框架上的跨平台的应用程序,能够访问网上银行的部分功能。
  • API 应用程序:通过 JSON/HTTPS API 为移动App 和单页面应用提供服务,他所需的数据从关系型数据库中获取。API应用程序还使用专用的 XML/HTTPS 接口与现有的大型机银行系统进行通信,获取客户账户和交易信息。还会调用邮件服务给用户发送邮件。

3. 组件

第三层是组件图,将单个容器放大,显示的就是组件。这些组件反映到代码库中的真实抽象。下面是一个虚拟网上银行的组件示例图,显示了API应用程序中的一些组件(不是全部)。

4. 代码

如果确实想要或者真有必要,可以放大个别组件,显示该组件的实现方式,下面是一个网上银行的UML类图(部分),显示了组成 MainframeBankingSystemFacade 组件的代码元素(接口和类)。img

这个UML图显示该组件由很多类组成,实现细节直接反映代码。不建议创建这种详细程度的图表,这些图表可以直接从大多数的IDE自动生成。

参考资料

  1. C4 模型 - 可视化架构设计
  2. infoq-用于软件架构的 C4 模型
4 声望
1 粉丝
0 条评论
推荐阅读
使用 working copy 同步笔记到obsidian
(1)跨平台,同时支持桌面电脑(Windows,Mac,Linux)和手机(Android,iOS)。(2)随时同步,打开任何一台机器,都能接着上一次的工作继续写。(3)实时存储,如果软件突然关闭,也不会丢失内容。(4)支持 M...

week阅读 4.4k

vivo全球商城:电商交易平台设计
vivo官方商城经过了七年的迭代,从单体架构逐步演进到微服务架构,我们的开发团队沉淀了许多宝贵的技术与经验,对电商领域业务也有相当深刻的理解。

vivo互联网技术2阅读 389

架构师日记-如何写的一手好代码
在日常工作中,我经常听到部分同学抱怨代码质量问题,潜台词是:“除了自己的代码,其他人写的都是垃圾,得送到绞刑架上,重构!”。今天就来聊一聊,如何写的一手好代码。要回答这个问题之前,得先弄清楚一个问题...

京东云开发者3阅读 516

封面图
flutter系列之:在flutter中使用相机拍摄照片
在app中使用相机肯定是再平常不过的一项事情了,相机肯定涉及到了底层原生代码的调用,那么在flutter中如何快速简单的使用上相机的功能呢?

flydean阅读 2.8k

浅谈复杂业务系统的架构设计 | 京东云技术团队
我们经常提到复杂系统,那么到底什么是复杂系统。我们看下维基的定义:复杂系统(英语:complex system),又称复合系统,是指由许多可能相互作用的组成成分所组成的系统。强调了两点:

京东云开发者1阅读 703

封面图
flutter系列之:创建一个内嵌的navigation
我们在flutter中可以使用Navigator.push或者Navigator.pushNamed方法来向Navigator中添加不同的页面,从而达到页面调整的目的。

flydean阅读 1.5k

好用的在线画图工具自研组件开源计划
PDDON在线画图自研组件开源计划,第一版开发历时2年,核心技术完全自研,从前端到后台均自研,核心开发仅一人,全栈开发者,暂时还在迭代中,等项目稳定后,会抽空将一些自研组件和工具包进行开源,先来占坑,可...

PDDON2阅读 321

封面图
4 声望
1 粉丝
宣传栏