天天看點

微服務項目中如何管理依賴版本号?

雲栖号資訊:【 點選檢視更多行業資訊

在這裡您可以找到不同行業的第一手的上雲資訊,還在等什麼,快來!

1.微服務架構

理論上的微服務架構和實際應用的微服務,往往會有一些差異。

理論上,在微服務架構中,各個獨立的微服務可以是各種語言,像我們使用的 Eureka 注冊中心,就是支援多種語言的,這樣可以充分發揮各種語言的優勢。如果是這樣,就沒有必要從項目整體上進行版本管理了,也管不了。

但是在實際操作中,考慮到團隊的技術棧,現有的技術生态等因素,大部分情況下,我們可能并不會在項目中摻雜其他語言進來,比如就是用 Java 開發,相信大部分小夥伴都是這麼做的。

既然統一都使用 Java 語言開發,那一個需求就随之浮出水面,就是項目依賴統一管理。

這個問題其實不是絕對的。

大型的微服務項目分屬不同的團隊開發,每個團隊維護好自己的項目,然後通過 RPC 或者 HTTP 的方式互相之間進行互動,這種情況下,版本号也可以交由各個團隊自行維護,這樣版本更新的時候,就不必一起更新,可以各個團隊獨自完成,逐個更新。

但是這種方式又可能會帶來另外一個問題,就是依賴版本的碎片化,在經過 N 多次疊代之後,可能會存在兩個項目所依賴的微服務版本差異非常大。

是以,在實際操作中,有的團隊會傾向于将項目版本統一管理。

統一管理也很簡單,就是搞一個 parent 就行了,但是有的小夥伴容易将這種 parent 和聚合工程搞混,是以這裡還是和大家稍微聊一下怎麼統一管理項目版本号。

2.統一管理版本号

2.1 聚合工程

先來說一說聚合工程,這裡我就不重新寫代碼了,微人事項目的服務端就是一個聚合工程。

微服務項目中如何管理依賴版本号?

我們可以來看下 vhrserver 的 pom.xml 檔案:

<parent>
    <artifactId>vhr</artifactId>
    <groupId>org.javaboy</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>vhrserver</artifactId>
<packaging>pom</packaging>
<modules>
    <module>vhr-mapper</module>
    <module>vhr-model</module>
    <module>vhr-service</module>
    <module>vhr-web</module>
</modules>           

複制代碼在這個聚合工程中,vhr-model 用來放實體類,vhr-mapper 用來放 Dao 層,vhr-server 用來放 Service 層,vhr-web 則是一個 Spring Boot 工程。

在聚合工程中,vhr-web 作為聚合工程的一部分,是無法獨立打包的,因為它依賴 vhr-service,vhr-service 依賴 vhr-mapper ,而 vhr-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 行不行?

這個是不行的,因為這是聚合工程,不能這樣做,隻能從聚合工程處打包。

2.2 統一管理版本号

上面說的聚合工程雖然也能實作版本号的統一管理,但是我們不能在微服務中采用這種方式。

你想一個微服務系統,包含了很多子系統,例如商品管理、交易管理、物流管理等等,要是想給商品管理打包,你還得從聚合工程處打包,打完之後,其他微服務子產品也生成了各自的包,這樣效率太低了。

但是我們還想實作版本号的統一管理,該怎麼辦呢?建立父子工程即可。這種項目結構和聚合工程很像,但是不一樣,很多小夥伴會搞混,是以這裡我來給大家稍微示範一下。

首先我們定義一個普通的 Maven 工程作為父工程,我把 pom.xml 檔案拎出來給大家參考下:

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.0.RELEASE</version>
    <relativePath/>
</parent>
<packaging>pom</packaging>
<groupId>org.javaboy.vmall</groupId>
<artifactId>vmall</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
    <!--省略-->
</properties>
<dependencyManagement>
    <dependencies>
        <!--省略-->
    </dependencies>
</dependencyManagement>           

大家可以看到,這個父工程本身也有一個 parent ,就是 Spring Boot 中的 parent。

這裡的 packaging 依然是 pom,然後我們定義了 dependencyManagement,将一些不包含在 spring-boot-starter-parent 中的依賴版本進行統一管理。但是大家注意,這裡沒有 modules 節點,這是一個很大的不同。

接下來,我們建立其他微服務項目,在建立的過程中,可以采用平鋪的方式,例如下面這樣:

微服務項目中如何管理依賴版本号?

也可以做成有層次結構的父子形式,像下面這樣:

微服務項目中如何管理依賴版本号?

兩種方式都可以。

然後在各個微服務項目中,重新修改 parent 即可:

微服務項目中如何管理依賴版本号?

如此之後,我們就可以對各個微服務中的依賴版本進行統一管理了。

這種項目結構和聚合工程并不一樣,這種項目打包,是可以獨立打包的。

首先我們先将父工程 install 到本地倉庫:

微服務項目中如何管理依賴版本号?

然後再去 install vmall-common 子產品,最後給 vmall-app-manager 進行打包,注意,現在的 vmall-app-manager 可以獨立打包,不需要從總的 parent 處進行統一打包。微服務項目中如果需要對項目版本進行統一管理,可以采用這種方式。

小夥伴們可以仔細品一品這種方式和聚合工程的差異。

【雲栖号線上課堂】每天都有産品技術專家分享!

課程位址:

https://yqh.aliyun.com/live

立即加入社群,與專家面對面,及時了解課程最新動态!

【雲栖号線上課堂 社群】

https://c.tb.cn/F3.Z8gvnK

原文釋出時間:2020-06-02

本文作者:江南一點雨

本文來自:“

掘金

”,了解相關資訊可以關注“掘金”