Spring Framework 6.0 已于11月份上旬正式發(fā)布 GA 版本。Spring Boot 3.0 也于11月25日正式發(fā)布 GA 版本。那么 Spring Cloud 2022 它還遠(yuǎn)嗎?
前言
Java 8 目前是國內(nèi)主流生產(chǎn)環(huán)境 Java 版本之一。雖然近幾年陸續(xù)發(fā)布了 Java 11、Java 17 官方 LTS 版本,但是 “你發(fā)任你發(fā),我用Java8” 的聲音反應(yīng)了大部分開發(fā)者的心聲。不過 Java 17 版本在性能上做了大量的優(yōu)化特別是 ZGC 的發(fā)布,促進(jìn)了國內(nèi)不少企業(yè)升級(jí)到 Java 17。
Spring 在 Java 語言的作用不言而喻,Spring Framework 5.0 發(fā)布已至今五年,是時(shí)候需要一個(gè)大的版本來革新技術(shù)棧了。借著 Java 17 的東風(fēng)我們認(rèn)為
“Java 17 + Spring Framework 6.0 + Spring Boot 3.0 + Spring Cloud 2022”
組合一定會(huì)在不久的將來被大家所接受,成為主流技術(shù)棧。當(dāng)然任何新技術(shù)大規(guī)模被認(rèn)可、落地都會(huì)有一定的滯后性,技術(shù)的發(fā)展 “穩(wěn)”字當(dāng)頭。
Spring Cloud Tencent 是基于騰訊開源的一站式微服務(wù)平臺(tái)北極星(集服務(wù)注冊(cè)發(fā)現(xiàn)、配置中心、服務(wù)限流熔斷、服務(wù)路由于一身)實(shí)現(xiàn)的 Spring Cloud 微服務(wù)解決方案套件。真正做到 “All In One”、 開箱即用,極大的降低企業(yè)的微服務(wù)實(shí)踐門檻。
無論北極星還是 Spring Cloud Tencent 當(dāng)前都在積極的修復(fù) Bug、完善用戶體驗(yàn)、迭代新功能。所以 Spring Cloud Tencent 也第一時(shí)間適配了 Spring Cloud 2022。此篇文章詳細(xì)講述了 Spring Cloud Tencent 從 2021 版本升級(jí)到 2022 版本的改動(dòng)點(diǎn)。為嘗鮮 2022 版本的廣大開發(fā)者提供一些參考。
一、升級(jí)過程
1.1 升級(jí)安裝 JDK 17
Oracle 官網(wǎng)下載 JDK 17 并安裝。安裝之后,本地修改 JAVA_HOME 環(huán)境變量,如下所示:
#echo$JAVA_HOME
/Library/Java/JavaVirtualMachines/jdk-17.0.5.jdk/Contents/Home
#java-version
javaversion"17.0.5"2022-10-18LTS
Java(TM)SERuntimeEnvironment(build17.0.5+9-LTS-191)
JavaHotSpot(TM)64-BitServerVM(build17.0.5+9-LTS-191,mixedmode,sharing)
安裝好 JDK 17 之后,同時(shí)需要在 Idea 里設(shè)置項(xiàng)目的編譯和運(yùn)行環(huán)境為 SDK 17。
1.2 升級(jí)依賴版本
Spring Cloud Tencent 項(xiàng)目引用的 Parent Pom 是 spring-cloud-build,所以需要升級(jí)到最新版本。
<parent>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-buildartifactId>
<version>4.0.0-RC2version>
<relativePath/>
parent>
可以看到 Spring-cloud-build 4.0.0-RC2 版本里定義的 Java 和 Spring Boot 版本已是最新的 Java 17 和 Spring Boot 3.0
<properties>
<java.version>17java.version>
<spring-boot.version>3.0.0-RC2spring-boot.version>
properties>
普通項(xiàng)目一般不需要繼承 spring-cloud-build ,而是通過 bom 的方式引入 Spring 全家桶。如果你的項(xiàng)目里定義了 Java、Spring Framework、Spring Boot、Spring Cloud 版本則需要同時(shí)升級(jí)。如下所示:
<properties>
<java.version>17java.version>
<spring.framework.version>6.0.1spring.framework.version>
<spring-boot.version>3.0.0spring-boot.version>
<spring.cloud.version>2022.0.0-RC2spring.cloud.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-framework-bomartifactId>
<version>${spring.framework.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-dependenciesartifactId>
<version>${spring.boot.version}version>
<type>pomtype>
<scope>importscope>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-dependenciesartifactId>
<version>${spring.cloud.version}version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
注意:Spring 非 GA 版本會(huì)先發(fā)布到 Spring 自己的 Maven 倉庫,而不會(huì)發(fā)布到中央倉庫。所以如果拉不到包,則需要在項(xiàng)目根 Pom 或者本地 ~/.m2/settings.xml 里配置 Spring Maven 倉庫。
<repositories>
<repository>
<id>nexus-snapshotsid>
<url>https://oss.sonatype.org/content/repositories/snapshots/url>
<releases>
<enabled>falseenabled>
releases>
<snapshots>
<enabled>trueenabled>
snapshots>
repository>
<repository>
<id>spring-snapshotsid>
<name>SpringSnapshotsname>
<url>https://repo.spring.io/snapshoturl>
<snapshots>
<enabled>trueenabled>
snapshots>
<releases>
<enabled>falseenabled>
releases>
repository>
<repository>
<id>spring-milestonesid>
<name>SpringMilestonesname>
<url>https://repo.spring.io/milestoneurl>
<snapshots>
<enabled>falseenabled>
snapshots>
repository>
repositories>
在升級(jí)過程中,大概率會(huì)出現(xiàn)包沖突的情況,例如 SCT 在升級(jí)過程中發(fā)現(xiàn)日志依賴有問題導(dǎo)致 example 啟動(dòng)失敗。最后排查到原因:SCT 自己定義了 logback版本為 1.2.11,但是升級(jí) Spring Boot 3.0 里傳遞依賴的版本為 1.4.5,所以導(dǎo)致版本沖突。最后解決方案就是把 SCT 定義的版本去掉,只用傳遞依賴的版本。
Tips:解決版本沖突大概率會(huì)占用比較多的時(shí)間,升級(jí)過程需要有耐心
1.3 修改不兼容代碼
javax 包替換為 jakarta 包
這是Java17 最大變更點(diǎn)之一,代碼所有 import javax 都要替換為 jakarta。編譯不通過的地方直接通過 Idea 自動(dòng)導(dǎo)入的方式變更即可。
spring-web 6.0 不兼容升級(jí)
SCT 在升級(jí)過程中發(fā)現(xiàn) spring-web 包下有些 API 不兼容,例如 ClientHttpResponse.getStatusCode() 老版本返回 HttpStatus,新版本返回的是 HttpStatusCode,改動(dòng)量很小。
AutoConfiguration 自動(dòng)裝配方式變更
在 Spring Boot 3.0 以前的版本,通過在 META-INF/spring.factories 文件中定義需要自動(dòng)裝配類,Spring Boot 在啟動(dòng)過程中就會(huì)執(zhí)行裝配 Bean,如下所示:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.tencent.cloud.plugin.pushgateway.PolarisStatPushGatewayAutoConfiguration
但是在 Spring Boot 3.0 中,則是通過在
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
文件定義需要自動(dòng)裝配的類。所以遷移過程就是把org.springframework.boot.autoconfigure.EnableAutoConfiguration 下配置的類都放到新的文件中。
這里需要注意的是原來在 spring.factories 可以定義多種類型的自動(dòng)裝配例如:
- org.springframework.boot.autoconfigure.EnableAutoConfiguration
- org.springframework.cloud.bootstrap.BootstrapConfiguration
- org.springframework.context.ApplicationListener
- ... ...
只需要把 org.springframework.boot.autoconfigure.EnableAutoConfiguration 部分遷移到 org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,其它部分還是放在 spring.factories 中無需遷移。
至此 SCT 2022 升級(jí)適配工作即已完成,可以看出升級(jí)工作量不大。
1.4 升級(jí)總結(jié)
SCT 屬于比較底層的基礎(chǔ)組件依賴的第三方庫少,所以整體適配工作量少。如果您的應(yīng)用是上層業(yè)務(wù)應(yīng)用依賴了大量的組件,例如:spring-security、spring-stream等。那升級(jí)的成本也會(huì)高很多。
下面是 github 網(wǎng)友 @herodotus-cloud 總結(jié)的升級(jí)關(guān)鍵點(diǎn):
- 更換 JDK 17 后,少部分第三方依賴包版本選擇和控制問題
- 新依賴包過時(shí)代碼替換。大多數(shù)沒問題,就怕遇到像 spring security 6 用法的變化
- starter 自動(dòng)配置注冊(cè)格式不同導(dǎo)致的,大多數(shù)第三方依賴都倒在這里
- 最怕的就是核心機(jī)制的變化,比如說反射。好像一些反射在 JDK 17 會(huì)有問題
- 最大的問題就是基礎(chǔ)設(shè)置組件升級(jí)不同步或者緩慢問題,比如依賴的某個(gè) SDK 沒有升級(jí) SDK 17,如果傳遞依賴了就會(huì)導(dǎo)致編譯問題。
- 如果還要考慮向下的兼容性,怕就難了
Spring 官方建議先升級(jí)到 Spring Boot 2.7 小版本,然后再升級(jí)到 Spring Boot 3.0 版本。通過小步升級(jí)的方式,可以更加的平滑。
二、嘗鮮使用 Spring Cloud Tencent 2022.0 版本
Spring Cloud Tencent 1.8.1-2022.0.0 版本已發(fā)布。通過引入 SCT BOM 的方式即可引入,如下所示:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.tencent.cloudgroupId>
<artifactId>spring-cloud-tencent-dependenciesartifactId>
<version>1.8.1-2022.0.0-RC2version>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
在此解釋一下 SCT 的版本號(hào)規(guī)則,版本號(hào)分為兩段:
{對(duì)應(yīng)的 Spring Cloud 版本}
SCT 版本號(hào)在各個(gè) Spring Cloud 版本之間對(duì)齊,例如 1.8.1-Hoxton.SR12 和 1.8.1-2021.0.3 ,SCT 版本號(hào)都是 1.8.1,功能完全對(duì)齊,只是引用的 Spring Cloud 不同。版本號(hào)中引入 Spring Cloud 版本為了一眼就能識(shí)別 Spring Cloud 版本對(duì)應(yīng)關(guān)系。開發(fā)者優(yōu)先選擇跟自己版本一致的 Spring Cloud 版本,再選擇最新的 SCT 版本。
使用 SCT 各個(gè)子模塊的功能,請(qǐng)參考 SCT Github Wiki 文檔。
三、 呼吁
第三方基礎(chǔ)組件的升級(jí)節(jié)奏會(huì)直接影響上層應(yīng)用的升級(jí),在此也呼吁第三方基礎(chǔ)組件的維護(hù)者能夠盡快跟進(jìn)適配。為廣大愿意嘗鮮的開發(fā)者和企業(yè)提供便利。
四、歡迎共建
如果您對(duì)微服務(wù)、Spring Cloud 技術(shù)感興趣,歡迎加入我們。您的一個(gè)建議、Issue、Pull Request 甚至只是一個(gè)小小的 Star 都是對(duì) Spring Cloud Tencent 社區(qū)極大的支持。
審核編輯 :李倩
-
JAVA
+關(guān)注
關(guān)注
19文章
2967瀏覽量
104762 -
Oracle
+關(guān)注
關(guān)注
2文章
289瀏覽量
35136 -
spring
+關(guān)注
關(guān)注
0文章
340瀏覽量
14344
原文標(biāo)題:緊跟Spring Boot 3生態(tài),Spring Cloud Tencent發(fā)布最新匹配版本!
文章出處:【微信號(hào):OSC開源社區(qū),微信公眾號(hào):OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論