实践中的模块化单体 | Foojay.io


随着微服务在应用程序现代化中的使用,我们已经看到了保持这种软件开发风格的优点和缺点。
当我们主要在企业组织中创建应用程序时,我们现在首先想到的是如何解耦我们的应用程序。
但有时创建太多微服务并不是最好的方法,而且可能会浪费你的时间和金钱。
因此,一种替代方法是利用模块


模块
模块化是一个概念,用于构建应用程序以通过模块分离逻辑单元,从而为您提供高度内聚的代码。
这些模块类似于一个隔间,您可以在其中放置应用程序的特定功能。
创建模块在软件开发过程中有不同的好处,无论是从头开始还是维护。

模块化单体
Modular Monolithic 是一种架构风格,您的代码是根据模块的概念构建的。
它将您的功能分隔在不同的逻辑单元中,但仍在单个应用程序中。
您可以将其描述为目录的组合,这些内部目录包含您的工作代码。
实际上,当您不想像微服务开发中那样管理不同的应用程序时,会使用这种风格。以下是使用 Modular Monolithic 的一些原因。

  • 单一部署——您的代码可以部署到云端,而无需配置和维护太多的应用程序。这些可以在批处理和一些微服务应用中看到。
  • 第三方依赖问题——假设您有超过 5 个应用程序使用 GitLab 或 JFrog Xray 违反库,这对开发人员来说可能是一个很大的痛苦。
  • 绿地新项目——当开始一个新的应用程序时,我们不希望立即在微服务中构建我们的应用程序。这可能会无缘无故地造成过度工程化和高昂的维护成本。
  • 开发人员的成本——太多的服务对组织来说成本高昂。这可以看出组织处于预算阶段并且几乎没有开发人员。

Modular Monolithic 的架构非常简单。它在一个单独的项目中,不同的组件被分隔到一个定义明确的逻辑目录中。模块或项目(对于多模块)定义了自己的方式来防止其实现泄漏。多模块可以通过 Gradle 的自定义配置定义要公开的内容,而 Spring Modulith 则利用内部模块的使用。

这可以使用单个 Dockerfile 或使用 Docker Compose 或基于 Kubernetes 的技术的多容器方法部署到云中。

本次演示中使用的应用程序是 Spring 和 Gradle 以及 Spring Framework 下的一个新模块Spring Modulith 

多模块

如果要创建和部署模块化单体应用程序,可以使用开发人员使用的一种常用方法,称为多模块方法。这可以使用 Maven 或 Gradle 等构建管理工具来完成。在这篇文章中,我们将处理 Gradle。
在上面的架构中,我们可以看到该应用程序由一个名为modular-monolithic-gradle的主项目中的 3 个不同项目组成。这 3 个项目称为子项目,可以定义向其他项目公开的内容。

  1. 公共项目也称为共享项目,其中包含全局或冗余代码,当您的服务模块过多时可以看到这些代码。
  2. 服务项目可能包含特定域的代码。在这种情况下,它的唯一职责是管理有关 Employee 的功能。根据您的用例,您可以拥有许多服务。
  3. 应用程序项目是您的主项目,它将调用您的服务,其行为类似于服务定位器。请在此处查看此模式的简单介绍。在 Spring 中,可以使用@Qualifier注释和扩展基本服务来完成对不同服务的调用。

子模块本身可以有自己的 Gradle 生命周期,由它们自己的构建文件控制。在他们中,您可以定义要公开或不公开的内容。

Spring Modulith

Spring Modulith 是 Spring 的一个实验项目,可用于模块化单体应用程序。它的特点是为 Spring Beans 提供了一个定义明确的模块化结构,并且可以控制暴露或不暴露的内容。

这里我们有与上面的多模块相同的结构,但使用不同的包和一个主项目(主包)。我们可以隐藏一些功能,例如存储库或模型类的代码。因此,控制你将如何公开你的bean。
您也可以在这里公开许多服务,并通过名为internal的包隐藏其各自的持久性和视图层。

对于需要再创建一个服务的场景,在com.rjtmahinay(主包)下再创建一个即可调用到其他服务(其他服务包)。
尽管在幕后,Spring Modulith 在其各自的子功能中也使用了多模块方法。
这项技术可以帮助我们改进创建模块的方式,尤其是在 Spring 中。


云部署

到目前为止,我已经讨论了使用通用方法和新方法创建模块化单体应用程序的方法。这次上面的架构显示了模块化单体的单一部署优势。
要将您的应用程序部署到云,您可以执行包含应用程序的单个图像的单个 Dockerfile 部署,或者以可以通过单个图像(单个 jar)或多图像(多个 jar)完成的多容器样式部署它. 
多模块方法可以将子项目部署为多容器部署,因为它可以拥有自己的映像(jar 文件)。
​​​​​​​对于Spring Modulith,由于内部可以是多模块,所以modulith应用依然可以单部署,也可以多部署。