伴隨着微服務框架的流行,SpringCloud項目也變得越來越龐大,由於它是由諸多子項目組成,為了更好管理SpringCloud的發布版本與各個子項目的版本關系,SpringCloud采用了一種新的版本規則來控制整個SpringCloud的版本發布。先來了解下SpringCloud的幾個相關網址:
項目主頁:https://spring.io/projects/spring-cloud
各個子項目的github地址: https://github.com/spring-cloud
在子項目中有一個spring-cloud-release子項目,項目地址 https://github.com/spring-cloud/spring-cloud-release ,該項目的作用就是管理SpringCloud版本的發布,主要做了二件事,一個是分布版本的規則,二是管理各個發布版本的子項目的版本的映射關系。下面就兩方面進行分析。
一.發布版本的命名規則
發布版本不采用通常的版本號的方式,而是采用英國倫敦的地鐵站名的站名(按字母順序)來命名發布的版本名稱。不過這個版本名稱后面還會以.xxx 的形式加一個額外的版本說明,
這個說明通常是以下形式:
SNAPSHOT: 快照版本,隨時可能修改
M: MileStone,M1表示第1個里程碑版本,一般同時標注PRE,表示預覽版版。
SR: Service Release,SR1表示第1個正式版本,一般同時標注GA:(GenerallyAvailable),表示穩定版本。
例如當一個版本的Spring Cloud項目的發布內容積累到臨界點或者解決了一個嚴重bug后,就會發布一個“service releases”版本,簡稱SRX版本,其中X是一個遞增數字。這個SRX會以 .形式跟在版本名稱的后面。
按如下規則,當前最新的SpringCloud發布版本就是 Hoxton.SR1
二. 子項目版本的映射管理
Spring Cloud項目通過 spring-cloud-dependencies 子項目的pom文件來管理不同的SpringCloud發布版本下的各個SpringCloud子項目的版本。以下是某個版本的spring-cloud-dependencies項目的pom文件的部分內容:
<dependencies> <!-- bom dependencies at the bottom so they can be overridden above --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-commons-dependencies</artifactId> <version>${spring-cloud-commons.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-dependencies</artifactId> <version>${spring-cloud-netflix.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-stream-dependencies</artifactId> <version>${spring-cloud-stream.version}</version> <type>pom</type> <scope>import</scope> </dependency> ............
可以看到在pom文件中引入了許多spring-cloud-xxx-dependencies這樣的管理子項目的依賴的項目,我們隨便打開其中一個,例如 spring-cloud-netflix-dependencies的pom文件的片斷來看下:
<properties> <archaius.version>0.7.6</archaius.version> <concurrency-limits.version>0.1.6</concurrency-limits.version> <eureka.version>1.9.8</eureka.version> <hystrix.version>1.5.18</hystrix.version> <ribbon.version>2.3.0</ribbon.version> <servo.version>0.12.21</servo.version> <zuul.version>1.3.1</zuul.version> <rxjava.version>1.2.0</rxjava.version> <rxjava-reactive-streams.version>1.2.1</rxjava-reactive-streams.version> <turbine.version>1.0.0</turbine.version> <eureka-jersey.version>1.19.1</eureka-jersey.version> <xstream.version>1.4.10</xstream.version> <okhttp3.version>3.8.1</okhttp3.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-eureka-client</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-netflix-archaius</artifactId> <version>${project.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-archaius</artifactId> <version>${project.version}</version> </dependency>
可以看到里面出現了各個子項目真正依賴的一些具體jar的版本。 當然這些jar都是以可選列表的方式提供出來的,也就是通過<dependencyManagement/>提供出來的。並不會真正被項目引入。下面通過一個具體的springCloud注冊中心的案例來看下,在具體項目pom文件中如何使用,有兩種方式:
不繼承父項目的方式
<properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
繼承父項目的方式
<parent> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-parent</artifactId> <version>${spring-cloud.version}</version> </parent> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.RELEASE</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
總結一下,分三個步驟:
1. 在 <properties/>中定義springCloud的版本常量
2. 以bom機制引入spring-cloud-dependencies,其版本由步驟1指定
3. 在 <dependencies>依賴列表中引入具體要用到的springCloud的組件依賴,即子項目,此時無需關注版本了