《程序员必读之软件架构》- C4模型

日常软件开发中,总是能看到一些诠释项目软件结构的图表。

图表主要的主要作用是帮助项目上的人员能够理解正在构建的软件架构,建立一个共同的愿景。当我们开发一个新功能时,能够参考已经建立起来的架构,以后的开发过程中向原有的架构靠拢。图表的存在也可以让新人快速理解项目架构,也能够帮助向非开发人员解释项目架构。

但是常常在图表中会有一些不容易理解的点,例如不同的颜色,不同的线条,不同的线框,分别代表了什么意思。

所以用图表来可视化软件,需要注意下面这些:

  • 清晰明确的表示图表中每一种颜色代表的意思。

  • 清晰明确的表示不同的图表元素的意义,例如不同形状的元素、虚线、实线、各种线框等等。

  • 清晰明确的表示图表元素之间的关系,不要遗漏了。

  • 不要使用模糊或太过抽象的术语。

  • 不要遗漏了技术选择。

  • 层次不要太混乱。

  • 不要包含太多的细节。

  • 不要遗漏了语境或逻辑起点。

为了清晰明了的表达图表的含义,给图表添加一个简单的图例(解释颜色编码、线条样式、形状等)是很有用的办法,图例的主要意义就是让团队保持一致的标记,避免歧义。

简单模型 - 适用于面向对象语言编程的软件系统

image.png

面向对象语言编程的软件系统一般由多个容器构成,一个容器又由多个组件构成,一个组件由一个或多个类实现。

对于类/组件/容器/系统的解释:

  • 类:在面向对象系统中,类是软件系统中的最小单元。
  • 组件:组件是由至少一个类组成的逻辑群组。
  • 容器:容器指的是能够在它内部执行组件或者驻留数据的东西,一般容器都是可执行文件,容器和容器之间的通信需要远程接口,例如SOAP网络服务、RESTful接口等等。
  • 系统:系统是能够提供价值的最高抽象层次。

通过一个简单模型来了解系统以后,要如何在项目中更加精确的表示整个架构,就可以采用C4模型。

C4模型

C4 分别是上下文(Context)、容器(Container)、组件(Component)和代码(Code)层次的图表,可以用这些图表来描述不同级别的软件架构,每种图表都有着不同的受众。这个就有点像世界地图、国家地图、省地图、市区街道地图,逐层递进,展示里面的内容,而每种地图的关注点也不同。

语境图/上下文 (Context)

语境图(有些参考文章里面翻译的是上下文),它展示的是系统大局景观的广角视图,主要包括关键的系统依赖和参与者,关注的重点是人和系统。

在画语境图时,要明确的标出:

  • 我们构建的软件系统是什么?
  • 谁用这个系统?
  • 如何融入已有的IT环境?

例子:
银行的个人客户使用互联网银行系统查看有关银行账户的信息并进行支付。互联网银行系统使用银行现有的大型机银行系统来执行此操作,并使用银行现有的电子邮件系统向客户发送电子邮件。
图中的颜色表示哪些软件系统已经存在(灰色)以及待构建的系统(蓝色)。【此例子来源于网络

image.png

容器图(Container)

首先明确容器的概念,容器指的是组成软件系统的逻辑上的可执行文件或者过程。容器之间的通信一般是进程间的通信。

所以画一个容器的时候要包含:

  • 名称:容器的逻辑名称(如“面向互联网的Web服务器”、“数据库”等)。
  • 技术:容器的技术选择(如ApacheTomcat7等)。
  • 职责:容器职责的高层次声明或清单。

之后就是画各个容器之间的通信:

  • 容器之间交互的目的(如“读/写数据”、“发送报告“等);
  • 容器之间的通信方法(如Web服务、REST、Java远程方法调用、Java消息服务);
  • 容器之间的通信方式(如同步、异步、批量等);
  • 容器之间的协议和端口号(如HTTP、HTTPS、SOAP/HTTP、SMTP、FTP等)。

例子:
互联网银行系统(虚线框)由五个容器组成:服务器端 Web 应用程序、客户端单页面应用程序、移动应用程序、服务器端 API 应用程序和数据库。
Web 应用程序是一个 Java/Spring MVC Web 应用程序,它仅提供静态内容(HTML、CSS 和 JavaScript),包括组成单页应用程序的内容。
单页面应用程序是一个运行在客户网络浏览器中的 Angular 应用程序,提供所有的网上银行功能。
或者,客户可以使用跨平台 Xamarin 移动应用程序访问互联网银行的部分功能。单页应用程序和移动应用程序都调用 JSON/HTTPS API,这是由服务器端运行的另一个 Java/Spring MVC 应用程序提供的。
API 应用程序从数据库中获取用户信息(关系数据库模式)。API 应用程序还使用专有的 XML/HTTPS 接口与现有的大型机银行系统进行通信,以获取有关银行账户或交易的信息。如果需要向客户发送电子邮件,API 应用程序还会调用现有的电子邮件系统。【此例子来源于网络

image.png

通过上面这个容器图可以让人了解高层次的技术选择,了解不同容器之间的交互,展示了之前的语境图和之后的组件图的连接,对软件开发者和支持/运营人员很有用。

组件图(Component)

组件图就是将单个容器放大,它可以让你清晰的看到容器的关键逻辑组件、组件之间的层级关系和依赖。
所以组件图要标明:

  • 名称:组件的名称
  • 技术:对组件的技术选择
  • 职责:对组件职责的高层次的声明

例子:
下面是一个虚拟的网上银行系统的组件图示例,显示了 API 应用程序中的一些组件(而不是全部)。两个 Spring MVC REST 控制器为 JSON/HTTPS API 提供访问点,每个控制器随后使用其他组件访问数据库和大型机银行系统中的数据。【此例子来源于网络

image.png

类图/代码(Code)

类图是一个可选的细节层次。如果想解释某个组件被怎样实现,可以画少量高层次UML类的图。一般是出于软件的复杂性,团队的规模和经验的考虑才画这个图。

总结

C4模型是比较容易理解、也比较容易使用的工具,可以通过C4模型来整理我们的架构,不论是一开始就设计的架构,还是回顾性总结的架构,都很适用。然后在画图过程中,一定要注意图表表达的含义没有歧义,达到团队内部的一致性非常重要。

阅读书籍:
[英]Simon Brown. 程序员必读之软件架构 (图灵程序设计丛书) .
例子参考 用于软件架构的 C4 模型

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容