如何在Spring Boot中构建可扩展的多模块项目

252 阅读8分钟

在Spring Boot中构建可扩展的多模块项目

在本教程中,我们将了解多模块架构--它对单片机的方法进行了大幅度的改进,但又提供了微服务架构的许多可能性,同时避免了微服务的巨大需求。

我们将建立一个医院管理系统的模型,并考虑到一些部门,使之成为一个成功的医疗应用。

前提条件

要充分利用本教程,需要具备以下条件。

  • 对微服务有基本了解。
  • 熟悉Spring Boot框架。
  • 良好的网络连接。
  • 安装了IntelliJ代码编辑器。

为什么多模块架构比单片机好?

传统的单体设计将一个项目的所有服务放在一个单一的模块中。所有东西都被安置在一个大盒子里,就像他们一样。在多模块中,每个服务在被放在大盒子里之前都被分割开来;项目。多模块允许代码的重复使用,这与单体不同。代码维护和添加新的特性或功能要容易得多。

多模块比微服务的优势

在微服务架构中,服务作为单独的项目被单独构建,并单独部署。例如,一家银行的认证服务,只是为了认证用户和请求而构建的,被部署到AWS服务器上。它通过一些结构化的方式与另一个服务进行通信。

比如同一家银行的 "转账服务",为转账而建,但部署在其他地方,如Heroku。在这种类型的设计下,同时在所有相互连接的服务中的可用性,可能是困难的。

在我们上面的例子中,如果认证服务器报告停机,其他所有依赖它的服务,如 "转账服务",也将无法工作。把这个问题研究出来解决是很有挑战性的,特别是如果报告停机的服务不是一个假的、在组织内受欢迎的服务。

在多模块中,只有一个项目,有几个隔间或模块,每个都代表一个服务--认证模块、转移模块等,都放在该项目中。这个项目只托管在一个地方,因此,其服务器的可用性意味着每次都有一个总的系统可用性。

这种方法也降低了项目的托管成本;微服务的维护成本显然更高。另外,在微服务中向项目传递依赖关系并不是一件简单的事情。它仍然可以归结为服务的可用性。

然而,在多模块中,依赖关系不会离开系统。将特定项目和特定模块的依赖关系传递出去要容易得多。这使得多模块架构的维护更容易。

多模块架构的缺点

多模块架构的一个明显的、看起来很糟糕的缺点是,当项目变得非常大,同时有很多人动手时,它可能变得笨拙和混乱。这是对项目的结构而言的。

即使独立的模块可以作为其他服务的jar 文件,但与微服务选项相比,这并不那么有效。说句题外话,多模块与单片机架构相比,似乎没有任何缺点

设置一个多模块项目

现在,我们可以通过设置Spring Boot多模块项目的过程。我们将模拟一个小型的医院管理系统,看看不同的部门在服务方面将如何互动。

为了构建这个项目,我们需要一些服务,比方说Doctor ServicePatient ServiceConsultation Service 。虽然这些可以根据其名称在不同的模块中共存,但我们将按照推荐的弹簧方式创建模块--数据、服务和控制器模块--都在同一个项目中--demohospital

创建这些模块的方法可以用来创建项目中所需要的任意数量的模块。

Multi Module in Picture

要开始,启动你的Intellij代码编辑器。如果你已经打开了一个项目,点击File > New > Project ,如果这是你第一次,点击New Project

Project setup

在产生的模型表格中,选择左边的Spring Initializr ,像下面这样详细地填写表格,然后点击Next

Spring Initializr

在下一页,选择你希望项目中所有模块可用的依赖性。对于这个项目,我选择了Spring WebLombok 的依赖关系。你可以根据需要添加任意数量的依赖。

注意,每个模块都应该在其不同的pom.xml 文件中安装特定的依赖项。

在选择了依赖项之后,点击下一步。你可以选择在同一个窗口中打开,从而取代目前打开的项目,或者在另一个窗口中打开。

Continue Project

现在,我们可以看到项目已经打开,我们选择的依赖项,显示在pom.xml 文件中。

Pom File

Landing Page

是时候创建模块了。首先是数据模块。这个模块包含了项目的实体和接口(JPA Repositories),允许我们在没有数据库的情况下进行无缝交互,在本例中是MySQL。

要创建第一个模块,右击项目名称demohospital ,然后点击New >Module 。在出现的模型表格中,选择Maven ,并点击Next

Setting up

键入一个Name(这将是模块的名称--在本例中是data ),保持Location ,然后点击Finish 。Spring Boot为你做剩下的事情。

Data

一个data 的模块已经被你创建了。

Data Two

按照同样的方法,让我们创建ServiceController 模块。

  • 在项目名称上点击右键。
  • 点击New >Module
  • 选择Maven ,输入一个名称(这次是Service )。
  • 选择Finish

现在你有一个Service 模块。

Service

Controller 模块的方法完全相同,如下图所示。

Controller

就像现在这样,医院所需的服务可以在这些模块中分别创建,并编写成相互之间的互动。

我们怎样才能使它们之间相互作用呢?

如前所述,数据模块保存了实体的模型和数据库操作。服务容纳了这些实体的实现。而控制器是项目的入口,在这里创建终端。

要使一个模块的方法可以相互使用(例如,要使data 模块的方法可以被service 模块使用),只需在service 模块的pom.xml 文件中粘贴以下内容并安装。

<dependency
    <groupId>project</groupId
    <artifactId>data</artifactId
    <version>0.0.1-SNAPSHOT</version>
</dependency>

现在,service 可以轻松使用data 的所有方法。你也可以用同样的方法将service 模块传入controller 模块。请注意,由于service 依赖于datadata 不能依赖service ,否则你会得到一个circular dependency error ,我将在下一篇文章中介绍 - 如何解决这个问题。

我们现在知道如何创建一个多模块项目。如果医院需要向病人和医生发送电子邮件,他们将需要一个通知服务。让我们创建一个,并让它供service 模块使用。

  • 在项目名称上点击右键。
  • 点击New >Module
  • 选择Maven ,并键入一个组ID和一个工件ID(这一次,它将是notification)
  • 选择Next ,然后选择Finish

你已经创建了Notification 模块。把它作为依赖关系粘贴到service 模块的pom.xml 文件中,把它传递给service 模块。

现在,他们可以发送电子邮件和文本信息以及其他通知。

<dependency
    <groupId>project</groupId
    <artifactId>notification</artifactId
    <version>0.0.1-SNAPSHOT</version>
</dependency>

Payment

奖金

现在让我们想象一下,以后要在医院管理系统中实施Payment Service

这是很直接的。

  • 打开项目,右键点击项目名称;hospital-project ,在这种情况下,点击project ,然后点击module
  • 输入这个新模块的详细信息,以符合我们对项目中现有模块使用的结构。
  • 把它作为一个依赖项安装在任何或所有需要它的方法的其他模块中,然后 viola,你的项目中就有了一个新模块。
  • 你可以尝试创建一个Logistics Service ,代表医院的物流部门。

Bonus

从多模块架构中获得微服务架构的好处

要在使用多模块架构的同时享受微服务所提供的东西是很简单的。这意味着你可以复制出上述任何一个modules/services 的jar文件--比如说Payment Service --并将其部署到另一个完全不同的项目中,以便重复使用。

你所需要做的就是在你想重用的模块的POM文件中写上<packagin>jar</packaging> ,作为jar ,最好是在所有的模块中。Spring Boot会自动为你完成剩下的工作。现在你可以在其他地方重用该模块。

值得注意的是,如果任何一个模块出现问题,你可以简单地进入该模块,修复问题并将其重建为一个独立的jar ,而不会干扰其他模块。

Packaging

总结

在本教程中。

  • 我们对单体、多模块和微服务项目架构有了一个简单的了解。
  • 我们研究了多模块架构对单体和微服务架构的优点和缺点。
  • 通过使用一个项目,我们能够建立一个小型的多模块项目,设置模块,并传递一些依赖关系。
  • 奖励部分要求教程的读者使用教程中描述的方法,创建一个新模块。

使用多模块架构更方便。你有利益的分离,并且在一个地方对项目有很多控制。识别系统停机并修复它的速度更快,可扩展性也得到保证。