【问题标题】:Manage multiple dependencies between microservices using Maven使用 Maven 管理微服务之间的多个依赖项
【发布时间】:2016-10-29 04:40:11
【问题描述】:

我们使用 Maven 来定义和管理我们的微服务之间的依赖关系。这是一个例子:

微服务 1

<artifactId>ms-1</artifactId>
<version>0.25.04-SNAPSHOT</version>
<dependencies>
    <dependency>
        <artifactId>ms-2</artifactId>
        <version>0.25.00-SNAPSHOT</version>
    </dependency>
</dependencies>

微服务 2

<artifactId>ms-2</artifactId>
<version>0.25.00-SNAPSHOT</version>
<dependencies>
    <dependency>
        <artifactId>ms-3</artifactId>
        <version>0.28.00-SNAPSHOT</version>
    </dependency>
</dependencies>

问题在于发布阶段需要大量时间并且完全手动:

  1. 为第一个微服务执行mvn:release(删除-SNAPSHOT
  2. 更改pom.xml中依赖的版本
  3. 为第二个微服务执行mvn:release(删除-SNAPSHOT
  4. 等等(实际上是在 15 个微服务上...)

我想知道是否有任何自动化方式来执行此版本(级联)?

谢谢

【问题讨论】:

    标签: maven dependencies release microservices


    【解决方案1】:

    Maven 项目不负责管理其依赖项的版本。它是构建负责其版本的依赖项工件的项目。

    在您的情况下,您可以创建一个(伪)聚合器项目,其中包含您所有的微服务作为子模块:

    <modules>
        <module>../ms-1</module>
        <module>../ms-2</module>
        <module>../ms-3</module>
        <module>../...</module>
        <module>../ms-15</module>
    </modules>
    

    假设您的微服务项目是兄弟姐妹,例如:

    +- (pseudo-)aggregator
    |  +- pom.xml
    +- ms-1
    |  +- pom.xml
    +- ms-2
    |  +- pom.xml
    +- ms-3
    |  +- pom.xml
    +- ms-...
    |  +- pom.xml
    +- ms-15
       +- pom.xml
    

    如果它们没有相应地调整相对 &lt;module&gt;s 路径。

    因此,在.../(pseudo-)aggregator $ mvnrelease:prepare 期间,系统会要求您提供所有项目的发布版本(默认为当前&lt;version&gt; 减去-SNAPSHOT,只需Enter 即可确认) ,这也会相应​​地更新您的&lt;dependencies&gt;/&lt;dependency&gt;/&lt;version&gt;s。

    或者您可以使用-B | --batch-mode 执行non-interactive release,它使用默认值而无需询问。

    最后是一个修正:

    release 不是Maven's build lifecycles阶段。这是maven-release-plugin 的快捷方式,有各种goals

    【讨论】:

    • 这很有趣,我不知道 Maven 聚合器。让我重新措辞以检查我是否正确。您建议我创建一个专门的 POM 项目,将我所有的微服务定义为模块,然后调用 maven 目标执行发布?
    • @frinux 没错。有关基本信息,请参阅 POM Reference, AggregationMaven: The Complete Reference, 3.6.2. Multi-module vs. Inheritance。另请参阅this answer,了解阶段、插件、目标等如何协同工作。
    • 有一个细节我忘了提:微服务通过一个 JAR(HTTP 客户端)相互消费,这个 JAR(HTTP 客户端)是生成的,但在 maven 发布的那一刻还不存在。如果模块在构建时不存在,似乎不可能声明它,我错了吗?
    • 我想我达到了我们架构的极限:当我们生成 API 客户端时,我们正在它们之间耦合微服务。也许正确的方法是使用 AMQP?
    • 感谢我为每个微服务创建了一个真实项目,并将它们声明为伪项目“发布”的所有模块,现在可以为每个微服务执行发布。
    猜你喜欢
    • 1970-01-01
    • 2013-06-22
    • 1970-01-01
    • 2019-05-05
    • 2022-01-27
    • 1970-01-01
    • 2011-04-07
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多