C4 模型学习

1. 引子

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

现实中存在一些问题:

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

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

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

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

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

C4 模型学习_第1张图片

2. 怎么做

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

C4 模型学习_第2张图片

1. 系统上下文

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

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

2. 容器

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

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

3. 组件

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

4. 代码

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

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

参考资料

  1. C4 模型 - 可视化架构设计
  2. infoq-用于软件架构的 C4 模型

你可能感兴趣的:(uml架构设计)