Spring Framework 6.0 已于11月份上旬正式發布 GA 版本。Spring Boot 3.0 也于11月25日正式發布 GA 版本。那么 Spring Cloud 2022 它還遠嗎?
前言
Java 8 目前是國內主流生產環境 Java 版本之一。雖然近幾年陸續發布了 Java 11、Java 17 官方 LTS 版本,但是 “你發任你發,我用Java8” 的聲音反應了大部分開發者的心聲。不過 Java 17 版本在性能上做了大量的優化特別是 ZGC 的發布,促進了國內不少企業升級到 Java 17。
Spring 在 Java 語言的作用不言而喻,Spring Framework 5.0 發布已至今五年,是時候需要一個大的版本來革新技術棧了。借著 Java 17 的東風我們認為
“Java 17 + Spring Framework 6.0 + Spring Boot 3.0 + Spring Cloud 2022”
組合一定會在不久的將來被大家所接受,成為主流技術棧。當然任何新技術大規模被認可、落地都會有一定的滯后性,技術的發展 “穩”字當頭。
Spring Cloud Tencent 是基于騰訊開源的一站式微服務平臺北極星(集服務注冊發現、配置中心、服務限流熔斷、服務路由于一身)實現的 Spring Cloud 微服務解決方案套件。真正做到 “All In One”、 開箱即用,極大的降低企業的微服務實踐門檻。
無論北極星還是 Spring Cloud Tencent 當前都在積極的修復 Bug、完善用戶體驗、迭代新功能。所以 Spring Cloud Tencent 也第一時間適配了 Spring Cloud 2022。此篇文章詳細講述了 Spring Cloud Tencent 從 2021 版本升級到 2022 版本的改動點。為嘗鮮 2022 版本的廣大開發者提供一些參考。
一、升級過程
1.1 升級安裝 JDK 17
Oracle 官網下載 JDK 17 并安裝。安裝之后,本地修改 JAVA_HOME 環境變量,如下所示:
#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 之后,同時需要在 Idea 里設置項目的編譯和運行環境為 SDK 17。
1.2 升級依賴版本
Spring Cloud Tencent 項目引用的 Parent Pom 是 spring-cloud-build,所以需要升級到最新版本。
<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>
普通項目一般不需要繼承 spring-cloud-build ,而是通過 bom 的方式引入 Spring 全家桶。如果你的項目里定義了 Java、Spring Framework、Spring Boot、Spring Cloud 版本則需要同時升級。如下所示:
<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 版本會先發布到 Spring 自己的 Maven 倉庫,而不會發布到中央倉庫。所以如果拉不到包,則需要在項目根 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>
在升級過程中,大概率會出現包沖突的情況,例如 SCT 在升級過程中發現日志依賴有問題導致 example 啟動失敗。最后排查到原因:SCT 自己定義了 logback版本為 1.2.11,但是升級 Spring Boot 3.0 里傳遞依賴的版本為 1.4.5,所以導致版本沖突。最后解決方案就是把 SCT 定義的版本去掉,只用傳遞依賴的版本。
Tips:解決版本沖突大概率會占用比較多的時間,升級過程需要有耐心
1.3 修改不兼容代碼
javax 包替換為 jakarta 包
這是Java17 最大變更點之一,代碼所有 import javax 都要替換為 jakarta。編譯不通過的地方直接通過 Idea 自動導入的方式變更即可。
spring-web 6.0 不兼容升級
SCT 在升級過程中發現 spring-web 包下有些 API 不兼容,例如 ClientHttpResponse.getStatusCode() 老版本返回 HttpStatus,新版本返回的是 HttpStatusCode,改動量很小。
AutoConfiguration 自動裝配方式變更
在 Spring Boot 3.0 以前的版本,通過在 META-INF/spring.factories 文件中定義需要自動裝配類,Spring Boot 在啟動過程中就會執行裝配 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
文件定義需要自動裝配的類。所以遷移過程就是把org.springframework.boot.autoconfigure.EnableAutoConfiguration 下配置的類都放到新的文件中。
這里需要注意的是原來在 spring.factories 可以定義多種類型的自動裝配例如:
- 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 升級適配工作即已完成,可以看出升級工作量不大。
1.4 升級總結
SCT 屬于比較底層的基礎組件依賴的第三方庫少,所以整體適配工作量少。如果您的應用是上層業務應用依賴了大量的組件,例如:spring-security、spring-stream等。那升級的成本也會高很多。
下面是 github 網友 @herodotus-cloud 總結的升級關鍵點:
- 更換 JDK 17 后,少部分第三方依賴包版本選擇和控制問題
- 新依賴包過時代碼替換。大多數沒問題,就怕遇到像 spring security 6 用法的變化
- starter 自動配置注冊格式不同導致的,大多數第三方依賴都倒在這里
- 最怕的就是核心機制的變化,比如說反射。好像一些反射在 JDK 17 會有問題
- 最大的問題就是基礎設置組件升級不同步或者緩慢問題,比如依賴的某個 SDK 沒有升級 SDK 17,如果傳遞依賴了就會導致編譯問題。
- 如果還要考慮向下的兼容性,怕就難了
Spring 官方建議先升級到 Spring Boot 2.7 小版本,然后再升級到 Spring Boot 3.0 版本。通過小步升級的方式,可以更加的平滑。
二、嘗鮮使用 Spring Cloud Tencent 2022.0 版本
Spring Cloud Tencent 1.8.1-2022.0.0 版本已發布。通過引入 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 的版本號規則,版本號分為兩段:
{對應的 Spring Cloud 版本}
SCT 版本號在各個 Spring Cloud 版本之間對齊,例如 1.8.1-Hoxton.SR12 和 1.8.1-2021.0.3 ,SCT 版本號都是 1.8.1,功能完全對齊,只是引用的 Spring Cloud 不同。版本號中引入 Spring Cloud 版本為了一眼就能識別 Spring Cloud 版本對應關系。開發者優先選擇跟自己版本一致的 Spring Cloud 版本,再選擇最新的 SCT 版本。
使用 SCT 各個子模塊的功能,請參考 SCT Github Wiki 文檔。
三、 呼吁
第三方基礎組件的升級節奏會直接影響上層應用的升級,在此也呼吁第三方基礎組件的維護者能夠盡快跟進適配。為廣大愿意嘗鮮的開發者和企業提供便利。
四、歡迎共建
如果您對微服務、Spring Cloud 技術感興趣,歡迎加入我們。您的一個建議、Issue、Pull Request 甚至只是一個小小的 Star 都是對 Spring Cloud Tencent 社區極大的支持。
審核編輯 :李倩
-
JAVA
+關注
關注
19文章
2972瀏覽量
104865 -
Oracle
+關注
關注
2文章
290瀏覽量
35150 -
spring
+關注
關注
0文章
340瀏覽量
14358
原文標題:緊跟Spring Boot 3生態,Spring Cloud Tencent發布最新匹配版本!
文章出處:【微信號:OSC開源社區,微信公眾號:OSC開源社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論