在Monorepo中,如何使用Maven对多个微服务进行版本控制?
部署的每一段代码都必须具有唯一的版本,这一点至关重要,它可以帮助您跟踪客户端的运行情况,标记部署的更改,并使你的工作变得轻松得多——特别是当你在半夜尝试了解客户端站点上运行的更改时。
在开发微服务时,它的重要性是之前的两倍。通常,你单独部署的服务,你是知道服务使用哪个依赖项的哪个版本。而许多开发人员面临的需求是如何在依赖项发生变化时自动(或手动)更新它们。
在我的一个项目中有一个单独的存储库,包含所有的服务,并分别构建和部署。而作为我们持续集成和部署的一部分,我们希望只构建被更改的服务或其依赖项之一已更改的服务,并且还要确保很容易向系统添加新服务。
然后我找到了 Versions Maven 插件,它可以用来自动更新Maven项目的版本,并确保自动更新所有依赖它的其他项目。
本次示例项目提供了三种服务。service2依赖于service1 、services3 依赖于service1 和service2。
每个服务都有一个包含自己POM文件的文件夹,每个子服务都有一个子文件夹。如下图所示:
我需要一个中心位置来管理所有的服务版本,所以我添加了以下到主(聚合器)pom.xml:
<properties>. . .<!-- Versions --><service1.version>1.1-SNAPSHOT</service1.version><service2.version>2.1-SNAPSHOT</service2.version><service3.version>3.1-SNAPSHOT</service3.version>
当服务版本改变时,我想自动更新服务pom.xml文件中的版本,所以我在聚合器pom.xml中添加了以下内容:
<properties>. . .<!-- auto version related --><service.version>0</service.version><version.update.enable>generate-sources</version.update.enable><version.phase>none</version.phase><service.name>-invalid-</service.name>. . .</properties><build><plugins><plugin><groupId>org.codehaus.mojo</groupId><artifactId>versions-maven-plugin</artifactId><version>2.7</version><executions><execution><phase>${version.phase}</phase><goals><goal>set</goal></goals><id>update-version</id><configuration> <generateBackupPoms>false</generateBackupPoms><artifactId>${service.name}*</artifactId><newVersion>${service.version}</newVersion></configuration></execution></executions></plugin></plugins></build>
我添加了三个新属性,可以通过每个单独的服务进行设置:
- version.phase -版本插件运行阶段。我需要在编译之前运行它,因此我定义了一个名为version.update的新属性。默认设置为一个不存在的阶段,这样版本控制将只针对我需要它们运行的服务运行。
 - service.name -服务名称。因为想要所有子项目具有相同的版本,这里使用了$ {service.name}。
 - service.version-设置服务版本。
 
接下来在每个服务(service1\pom.xml)添加下面几行:
<properties><service.name>service1</service.name><version.phase>${version.update.enable}</version.phase><service.version>${service1.version}</service.version></properties>
现在每个服务都定义了它的名称(与目录相同),设置version.phase 使用version.update.enable (其被设置为 generate-sources)和设置该版本的值为在根目录pom.xml中定义的属性。
现在,如果你更新版本运行MVN编译 版本将会自动更新:
使用这种方法,我们能够向所有现有的微服务添加版本控制,并轻松地创建新服务。这样,所有依赖版本的自动版本更新就完成了。
