【问题标题】:How to maintain same Spring Boot version across all microservices?如何在所有微服务中维护相同的 Spring Boot 版本?
【发布时间】:2019-09-19 01:14:44
【问题描述】:

我正在使用微服务架构创建一个应用程序。我想知道我们是否可以在所有微服务中管理相同的 Spring Boot 版本。我只是不想在创建新微服务时在 pom.xml 中提及 Spring Boot 版本。如果我们可以在一个位置管理 Spring Boot 版本,那么它将确保所有微服务都使用相同的 Spring Boot 版本,并且很容易为所有微服务升级它。

如果可以怎么管理?

这是一个好习惯吗?

【问题讨论】:

  • 只需为您的微服务创建基础父 pom 并在那里设置依赖版本(或依赖本身)。

标签: java spring spring-boot microservices dependency-management


【解决方案1】:

对于每个微服务,它们都应该有自己的版本。每个微服务都应该有自己的升级周期。如果您最终创建了一个检测 Spring Boot 版本的通用项目。不同的微服务无法继续利用 Spring 中的新功能以及其他可能依赖于特定 Spring 版本的框架

【讨论】:

    【解决方案2】:

    微服务中没有这样的东西,你需要知道并在创建任何新的微服务时保持相同的版本。

    【讨论】:

      【解决方案3】:

      您应该使用父/子 pom.xml。 (pom help doc)

      定义一个父 pom 文件,并在那里声明所有版本(在属性标签中)。 类似的东西:

      <properties>
        <spring.version>5.0.5.RELEASE</spring.version>
        <.....>
      </properties>
      

      并且,在您的每个项目中,使用该父 pom,并在声明依赖项时,使用以下内容:

      <dependency>
        <groupod>xyz</groupid>
        <artifactid>xyz</artifactid>
        <version>${spring.version}</version>
      </dependency>
      

      当您想要升级一组库时,这将有所帮助,您只需在一个地方进行更新,然后重新构建您的所有项目。

      【讨论】:

        【解决方案4】:

        如果可以怎么管理?

        使用 Maven/Gradle 父 pom 定义微服务项目将继承的所有版本和依赖项。

        这是一个好习惯吗?

        是的,有一定的衡量标准。
        这是个好主意,因为通过您开发/维护的一组项目使用一致的依赖版本是个好主意。
        但这并不意味着所有项目都会在 N 时刻使用相同版本的父 pom,但理想情况下,它们应该倾向于使用最新版本,就像你的父 pom 的最后一个版本一样使用 Spring Boot 的最后一个稳定版本。

        【讨论】:

          【解决方案5】:

          如果你真的想这样做,你可以使用 Maven 来构建你的独立应用程序(微服务),使用父 POM 和 Maven 的 Dependency Management 功能 (Dependency Management is not the same as Depdencies) 来控制使用哪个版本的 Spring Boot .

          但是,您应该严格要求所有微服务使用相同版本的 Spring Boot。如果你这样做了,并且其中一个微服务必须使用更新版本的 Spring Boot(例如,因为它有一个重要的新特性),你就是在强制所有同时更新微服务。微服务的主要好处之一是每个微服务都可以单独构建、更新和升级部署,因此您将剥夺您的系统的这种好处。

          然而,如果做得好,这可以让你两全其美。

          • 旧的微服务可以继续使用旧版本的父 POM。
          • 新的和更新的微服务可以使用新版本的父 POM。
          • 很容易看出微服务是否使用了(非常)旧版本的父 POM,因此应该更新。
          • 父 POM 的当前版本可以指示您认为使用哪些版本的依赖项是“最佳实践”。

          但是,do not be tempted to use a multi-module Maven structure,因为那样你将强制微服务使用相同的 Spring Boot 版本,这在每个微服务的构建中引入了过多的耦合。

          【讨论】:

            【解决方案6】:

            虽然“独立性”确实是微服务领域的一个重要价值,但这并不意味着猖獗的代码重复是首选。选择两害相权取其轻,创建一个仅包含 pom 文件(无 java 代码)的父项目,并让所有微服务使用这个 pom 作为其父 pom。在这个父 pom 文件中,您可以使用 &lt;dependencyManagement&gt; 标签声明所有依赖项的所有版本,并使用 &lt;pluginManagement&gt; 标签声明所有版本的插件。这些标签实际上并没有向您的实际项目添加任何依赖项或插件,它只是声明了项目过于依赖它们时要使用的版本。

            如果你已经使用 spring-boot-starter pom 作为你的父级,这可以传递地工作:你的微服务有你的父级 pom,你的父级 pom 有 spring boot starter pom 作为它自己的父级。

            如果在未来某个时候,一个微服务需要从这个父 pom 中分离出一个或多个特定依赖项,您可以在该项目的 pom 中声明新版本,并且将使用这些值来代替,有效地覆盖在父 pom(s),所以你不会失去这种灵活性。

            但是,我们已经使用 Spring Boot 微服务两年了,事实证明,保持环境一致且易于升级,这对我们来说比独立更有价值。

            【讨论】:

              【解决方案7】:

              作为一种选择,如果您使用私有 Maven 存储库,您可以为您使用的所有 Spring 库安装一个版本的工件(甚至更多,您可以将它们全部标记为您的自定义版本)。然后在您的所有项目中,只需在依赖项中使用此标签即可。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-05-25
                • 2020-07-14
                • 2016-09-25
                • 1970-01-01
                • 2018-09-21
                • 2021-04-09
                • 2021-01-28
                • 2017-10-04
                相关资源
                最近更新 更多