当前位置: 首页 > 科技观察

软件架构的C4模型

时间:2023-03-22 17:27:45 科技观察

软件架构图可以是一个非常有用的交流工具,但是很多团队减少了图的创建,而且在创建图的时候往往是模糊的。本文作者根据自己多年的软件开发和团队合作经验,提出了C4模型。C4模型由一系列描述上下文、容器、组件和代码的分层软件架构图组成。C4模型的层次结构提供不同级别的抽象,每个抽象级别与不同的受众相关。同时,C4模型也是向软件开发团队引入轻量级建模的一种方式。软件架构图是表达您将如何构建软件系统(预设计)或现有软件系统如何工作(审查文档、知识共享和学习)的好方法。然而,您看到的大多数软件架构图可能只是一堆方框和线条。敏捷软件开发宣言的一个副作用是许多团队已经停止或缩减了他们的图表和文档工作,包括UML的使用。如今,这些团队倾向于依赖他们在白板上绘制的临时图表,或使用Microsoft的Visio等通用图表工具。IonutBalosin去年写了一篇名为“软件架构图的艺术”的文章,其中他描述了一些与难以理解的符号和不明确的语义相关的常见问题。模糊的软件架构图容易引起误解,这会减慢优秀团队的进度。在我们的行业中,我们真的应该努力创建更好的软件架构图。基于多年自己开发软件以及与世界各地的团队合作的经验,我构建了一个我称之为“C4模型”的东西。C4代表Context、Container、Component和Code——一系列层次图,可用于描述不同缩放级别的软件架构,每个级别适合不同的受众。将其视为用于代码的Google地图。要创建代码映射,您首先需要一组通用的抽象来创建一种通用语言来描述软件系统的静态结构。C4模型使用容器(应用程序、数据存储、微服务等)、组件和代码来描述软件系统的静态结构。它还考虑到使用软件系统的人。1.Layer1:SystemContextLayer1是系统上下文图,它显示了你正在构建的软件系统,以及系统与用户和其他软件系统之间的关系。以下是描述网上银行系统上下文的系统上下文图示例:银行的个人客户使用网上银行系统查看银行账户信息并进行支付。网上银行系统使用银行现有的大型银行系统来执行此操作,并使用银行现有的电子邮件系统向客户发送电子邮件。图中的颜色表示哪些软件系统已经存在(灰色),哪些系统尚未构建(蓝色)。2.Layer2:容器Layer2是一个容器图,它放大了一个软件系统,展示了构成软件系统的容器(应用程序、数据存储、微服务等)。技术决策也是其中的关键部分。以下是Internet银行系统的示例容器图。图中显示网上银行系统(虚线框)由5个容器组成:服务端Web应用、客户端单页应用、移动端应用、服务端API应用、数据库。Web应用程序是一个Java/SpringMVCWeb应用程序,仅提供静态内容(HTML、CSS和JavaScript),包括构成单页应用程序的内容。单页应用程序是一个Angular应用程序,它在客户的Web浏览器中运行并提供所有网上银行功能。或者,客户可以使用跨平台的Xamarin移动应用程序来访问网上银行的一些功能。单页应用程序和移动应用程序都调用一个JSON/HTTPSAPI,该API由运行在服务器端的另一个Java/SpringMVC应用程序提供。API应用程序从数据库(关系数据库架构)中获取用户信息。API应用程序还使用专有的XML/HTTPS接口与现有大型机银行系统进行通信,以获取有关银行账户或交易的信息。如果API应用程序需要向客户发送电子邮件,它还会调用现有的电子邮件系统。3.Layer3:Components第三层是组件图,将单个容器放大,展示其中的组件。这些组件映射到代码库中的真实抽象(例如一组代码)。下面是一个假设的在线银行系统的组件图示例,显示了API应用程序中的一些(但不是全部)组件。两个SpringMVCREST控制器提供对JSON/HTTPSAPI的访问点,然后每个控制器使用其他组件访问数据库和大型机银行系统中的数据。4.第4层:代码最后,如果您真的想要或需要,您可以放大各个组件以显示该组件是如何实现的。以下是虚构网上银行系统的UML类图的示例(部分),显示了构成MainframeBankingSystemFacade组件的代码元素(接口和类)。说明组件是由很多类组成的,实现细节直接体现在代码中。我不建议在这种详细级别上创建图表,有时您可以直接从大多数IDE中获取它们。5.符号C4模型没有预先定义任何特定的符号。您在这些示例图中看到的是适用于白板、纸张、便签、索引卡和各种图表工具的简单符号。您还可以使用UML进行标记,并适当地使用包、组件和原型。无论您使用哪种表示法,我都建议让每个元素都包含名称、元素类型(即“人”、“软件系统”、“容器”或“组件”)、技术选择(如果有)和一些描述性文本。图表中有这么多文本似乎很不寻常,但这些额外的文本有助于消除软件架构图中经常出现的模棱两可的表示。即使这些符号对您来说很明显,仍然要确保为这些符号提供图例。图例应包括颜色、形状、首字母缩略词、线条样式、边框、尺寸等。理想情况下,符号在每个细节级别都应保持一致。下面是前面显示的容器图的图例。最后,不要忘记标题,它应该出现在每个图上,以清楚地描述每个图的类型和范围(例如,“网上银行系统的系统上下文图”)。6.更多信息C4模型是一种在不同抽象层次上交流软件架构的简便方法,因此可以向不同的受众讲述不同的故事。这也是向软件开发团队引入(并经常重新引入)严格和轻量级建模的一种方式。有关C4模型的更多信息,以及补充图表(运行时和部署)示例、符号列表、常见问题解答、会议讲座视频和工具选项,请参阅http://c4model.com/。7.关于作者SimonBrown是一位软件架构方面的独立顾问,也是“SoftwareArchitectureforDevelopers”(面向开发人员的软件架构、技术领导力和敏捷性平衡指南)的作者。他还是C4软件架构模型的创建者,这是一种创建代码映射的简单方法。Simon经常在国际软件开发会议上发表演讲,并周游世界帮助组织可视化和记录他们的软件架构。