微服务项目中如何管理依赖版本号?

云栖号资讯:【点击查看更多行业资讯】
在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来!


1.微服务架构

理论上微服务架构和实际应用的微服务,往往会有一些差异。

理论上,在t A k微服务架构中,各个独立的微服务可以是各种语言,像我们使用的 Eureka 注册中心,就是支持多种语言的,这样可以充分发挥各种语言的优势。如果是这样,就没有必要从项目整体上进行版本管理了,也管不了。w [ # F

但是在实际q ; % Q ` a操作中,考虑到团队的技术栈,现有的技术生态等因素* e 4 I f K ] =,大部分情况下,我们可能5 Q = S ) @并不会在项目中掺杂其他语言进来,比如就是用 Java 开发,相信大部分小伙伴都是这么做的。

既然统一都使用 Java 语言开发,那一个需求就随之浮出水面,就是项目依赖统一管理。

这个问题其实不是绝对的。

大型的微服务项目分属不同的团队开发,每个团队维护好自己的项目,然后通过 RPC 或者 HTTP 的方式互相之间进行交互,这种情况下,版本号也可以交由各个团队自行维护,这样版- ; ; 6 W本升级的时候,就不必一起升级,可以6 z p @ p p f y B各个团队独自完成,逐个升级。

但是这种方式又可能会带来另外一个问题,就是依赖版本的碎片化,在经过 N% ~ B 1 # a V 多次迭代之后,可能会存在两个项目所依赖的m ` 7 o微服务版本D H F D Z _ {差异非常大。

因此,在实际操I 1 H , _ Q i T T作中,有的团队会倾向于将项目版本统一管理。

统一管理也& S m # L D 5很简单,就是搞一个 parent 就行了,但是P u L H K M 4 8有的小伙伴容易将这种 parent 和聚合工程搞混,因此这里还是和大家稍微聊一下怎么统一管理项目版本号。

2.统一管理版本号

2.1 聚合工程

先来说一说聚合工程3 H y b @ e j,这里我就不重新写代X ~ + X码了,微人事项目的服务端就是一个聚合工程。

微服务项目中如何管理依赖版本号?

我们可以来看下 vhrserver 的 pom.xml 文件:

<parent>
<artifact| M $ - * /Id>vhr</artifactId>
<groupId&g0 , j mt;org.| , 2 * 3 r javaboy</gro1 m , upId>
<versi2 O b U 1 u 8 W -on>1.0-SNAPSHOT</version>
</par3 T T 0 : h Zent>
<modelVersion&gA . 6 =t;4.0.0</mode: ] . % t - = $ RlVersion>
<artifactId>vhrserv| T L 3 4 + w Ker</aru - $ I l dtifactId>
<packaging>pom</packaging>
<modules>
<module>vhr-mapper</module>
<module>vhr-model</module>
<module>vhr-% : K f m F Pservice</mod+ D 8 b G % [ule>
<module>vhr-web<y E x Z & 0 {/module>
</modules>

复制代码在这个聚合工程中,vhr-model 用来放实体类,v q ( a k Uvhr-mapper 用来放 Dao 层,vhr-se} 5 w 2 R O !rver 用来放 Service 层,vhr-web 则是一个 Spring Boot 工程。

在聚合工程中,vhr-web 作为聚合工程的一部分o 8 } _ k c g,是无法独立打包的,因为它依赖 vhr-service,vhr-serv/ K 3 J !ice 依赖 vhr-mapper ,而 vhr} p * a S 3 l j 2-mapper 则依赖 vhr-model。我们需要从 vhrserver 处打包,这样它会自动解决 module 之间的依赖问题。

单独给 vhr-web 打包会报如下错误

微服务项目中如何管理依赖版本号?

从 vhrserver 处统一打包,结果如下:

可以看到,我们需要直接打包聚合工程,内部的依赖问题会自动解决。

有人可能会问,既然前面报 Could not find artifact org.javaboy:vhr-service:pom:1.0-SNAPSHOT 错误,那我先把 vhr-service install 到本地仓库,再去打包 vhr-web 行不行?

这个是不行的,因为这是聚合工程,g j a j / O 3 x不能这样做,只能从聚P ^ H 4 F 6合工程处打包。

2.2 统一管理版本号

上面说的聚合工程虽然也能实现版本号的统一管理,但是我们不能在微服务中采用这种方k E . 6 U 式。

你想一个微服务系统,包含了很多子系统,例如商品管理、交易管理、物流管理1 M m l等等,要是想给商品管理打包,你还得从聚合工程处打包,打完之后,其他F c F ) e微服务模块也生成了各自的包,这样效率太低了。

但是我d z v h y 5 a们还想实现版本号的统一管理,该怎么办呢?创建父子工程即可。这种项目结构和聚合工g f z C o f I A h程很像,但是不一样,很多小伙伴会搞混,所以这里我来给大家稍微演示一下。

首先我们定义一个普通的 Maven 工程作为父工程, * X V我把 pom.xml 文件拎出来给大家参考下:

<parent>
<groupId>org.springframework.boot</group{ Y II$ - W B  # N ]d>
<artifactId>spring-boot-starter-paren% 3 r y Z 9 t ) Nt</i e @ D = v ) lartifactId>
<version>2.3.0.RELEASE</v{ ( ( $ iersion>
<relativePath/>
</parent>
<packagi8 + D 4 G C { 9ng>pom<7 9 _ m e P a #;/packaging&g^ Z b m pt;
<groupId>org.jav@ g $ $aboy.vmall</groupId>
<artifactId&q ] ? Tgt;vmall</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<!--省略-->
</properties&F W C U } Sgt;
<dependencyMan= C fagement>
<dependencies>
<!--省略-->
</dependencies>
</dependencyManagement>) M 9 q G m

大家可以看到,这个父工程本身也有一个 parent ,K N / ]就是 Spring Boot 中的 parent。

这里的 packaging 依然是 pom,然后我们定义了 depends a Q O ^ x T G uencyManagement,将一些不包含在 spri5 W m h Rng-boot-star@ K Rter-parent 中的依赖版本进行统7 ~ y T + @一管理。但是大家注意^ E ( M H o,这里没有 modules 节点,这是一个很大的不同。

接下来,我们创建其他微服务项目,在创建的过程中,可以采用平铺的方式,例如下面这] 6 / # G样:

微服务项目中如何管理依赖版本号?

也可以做成有层次结构的父子形式,像下面这样:

微服务项目中如何管理依赖版本号?

两种方式都可以。

然后在各个微i 8 $ . 0 m服务项目中,重新修改 parent 即可:

微服务项目中如何管理依赖版本号?

如此之后,我们就可以对各个微服务中的依赖版本进行统一管理了。

这种项目结构和聚合工程并不一样,这种项目打包,是可以独立打包的。

首先我们先将父工程 instalx ! ) b _ ` g Nl 到本地仓库:

微服务项目中如何管理依赖版本号?

j ^ 1 b y后再去 install vmall-common 模块,最后给 vmall-app-manager 进行打包,注意,现在的 vmall-app-manager 可以独立打包,不K M t F @ i & q需要从总的 parent 处进行统一打包。微服务项目中如果需要对项目版本进行统一管理,可以采用这种方式。

小伙伴们可以仔细品一品这种方式和聚合工程的差异。

【云栖号在线课堂】每天都有产品技术专家分享!
课程地址:https://yqh.aliyun.com/live

立即加入社群,与专家面对面,及时了解课程最新动态!
【云栖号在线课堂 社群】https://c.tb.cn/F3.Z8gvnK

原文发n M m布时间:2020-06-02
本文作者:江J a 0 L 7南一点雨
本文来自:“掘金”,了解相关信息可以关注“掘金”