IDC

在Monorepo中,如何使用Maven对多个微服务进行版本控制?

作者:admin 2021-06-08 我要评论

【51CTO.com快译】项目部署的每一段代码都必须具有唯一的版本,这一点至关重要,它可以帮助您跟踪客户端的运行情况,标记部署的更改,并使你的工作变得轻松得多...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

【51CTO.com快译】项目部署的每一段代码都必须具有唯一的版本,这一点至关重要,它可以帮助您跟踪客户端的运行情况,标记部署的更改,并使你的工作变得轻松得多——特别是当你在半夜尝试了解客户端站点上运行的更改时。

在开发微服务时,它的重要性是之前的两倍。通常,你单独部署的服务,你是知道服务使用哪个依赖项的哪个版本。而许多开发人员面临的需求是如何在依赖项发生变化时自动(或手动)更新它们。

在我的一个项目中有一个单独的存储库,包含所有的服务,并分别构建和部署。而作为我们持续集成和部署的一部分,我们希望只构建被更改的服务或其依赖项之一已更改的服务,并且还要确保很容易向系统添加新服务。

然后我找到了 Versions Maven 插件,它可以用来自动更新 Maven 项目的版本,并确保自动更新所有依赖它的其他项目。

本次示例项目提供了三种服务。service2依赖于service1 、services3 依赖于 service1 和 service2。

每个服务都有一个包含自己POM文件的文件夹,每个子服务都有一个子文件夹。如下图所示:

我需要一个中心位置来管理所有的服务版本,所以我添加了以下到主(聚合器) pom.xml:

  1. <properties> 
  2. . . . 
  3. <!-- Versions --> 
  4. <service1.version>1.1-SNAPSHOT</service1.version> 
  5. <service2.version>2.1-SNAPSHOT</service2.version> 
  6. <service3.version>3.1-SNAPSHOT</service3.version> 

当服务版本改变时,我想自动更新服务 pom.xml 文件中的版本,所以我在聚合器 pom.xml 中添加了以下内容:

  1. <properties> 
  2.     . . . 
  3.     <!-- auto version related --> 
  4.     <service.version>0</service.version> 
  5.     <version.update.enable>generate-sources</version.update.enable> 
  6.     <version.phase>none</version.phase> 
  7.     <service.name>-invalid-</service.name>     
  8.     . . . 
  9. </properties> 
  10. <build> 
  11.     <plugins> 
  12.         <plugin> 
  13.             <groupId>org.codehaus.mojo</groupId> 
  14.             <artifactId>versions-maven-plugin</artifactId> 
  15.             <version>2.7</version> 
  16.             <executions> 
  17.                 <execution> 
  18.                     <phase>${version.phase}</phase> 
  19.                     <goals> 
  20.                         <goal>set</goal> 
  21.                     </goals> 
  22.                     <id>update-version</id> 
  23.                     <configuration> 
  24.                         <generateBackupPoms>false</generateBackupPoms> 
  25.                         <artifactId>${service.name}*</artifactId> 
  26.                         <newVersion>${service.version}</newVersion> 
  27.                     </configuration> 
  28.                 </execution> 
  29.             </executions> 
  30.         </plugin> 
  31.     </plugins> 
  32. </build> 

我添加了三个新属性,可以通过每个单独的服务进行设置:

  • version.phase -版本插件运行阶段。我需要在编译之前运行它,因此我定义了一个名为 version.update 的新属性。默认设置为一个不存在的阶段,这样版本控制将只针对我需要它们运行的服务运行。
  • service.name -服务名称。因为想要所有子项目具有相同的版本,这里使用了$ {service.name}。
  • service.version-设置服务版本。

接下来在每个服务(service1\pom.xml)添加下面几行:

  1. <properties> 
  2. <service.name>service1</service.name> 
  3. <version.phase>${version.update.enable}</version.phase> 
  4. <service.version>${service1.version}</service.version> 
  5. </properties> 

现在每个服务都定义了它的名称(与目录相同),设置 version.phase 使用 version.update.enable(其被设置 generate-sources)和设置该版本的值为在根目录 pom.xml 中定义的属性。

现在,如果你更新版本运行 MVN 编译版本将会自动更新:

使用这种方法,我们能够向所有现有的微服务添加版本控制,并轻松地创建新服务。这样,所有依赖版本的自动版本更新就完成了。

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

【责任编辑:黄显东 TEL:(010)68476606】
本文转载自网络,原文链接:https://dzone.com/articles/versioning-multiple-microservices-in-a-monorepo-using-maven

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 【活动回顾】Edge X Kubernetes,探索

    【活动回顾】Edge X Kubernetes,探索

  • 云端赛车-Amazon DeepRacer 的前世今生

    云端赛车-Amazon DeepRacer 的前世今生

  • 云原生时代,企业多活容灾体系构建思路

    云原生时代,企业多活容灾体系构建思路

  • 如何帮用户管好云账本?阿里云数据库助

    如何帮用户管好云账本?阿里云数据库助