Spring Boot 升級3.x 指南

Spring Boot 升級3.x 指南

1. 升級思路

先創建一個parent項目,打包類型為pom,繼承自spring boot的parent項目

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.x</version>
</parent>

然后把版本集中放在這個pom里面,示例如下

<properties><!-- 建議添加全局變量 java.version,maven.compiler.source, maven.compiler.target--><java.version>17</java.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><spring-cloud-dependencies.version>2022.0.4</spring-cloud-dependencies.version><spring-cloud-starter-netflix.version>2.2.10.RELEASE</spring-cloud-starter-netflix.version>
</properties>

然后添加dependencyManagement節點,示例如下:

<dependencyManagement>  <dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud-dependencies.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId><version>${spring-cloud-starter-netflix.version}</version><exclusions><exclusion><artifactId>jsr311-api</artifactId><groupId>javax.ws.rs</groupId></exclusion><exclusion><artifactId>jackson-annotations</artifactId><groupId>com.fasterxml.jackson.core</groupId></exclusion><exclusion><artifactId>jackson-core</artifactId><groupId>com.fasterxml.jackson.core</groupId></exclusion><exclusion><artifactId>jackson-databind</artifactId><groupId>com.fasterxml.jackson.core</groupId></exclusion><exclusion><artifactId>guava</artifactId><groupId>com.google.guava</groupId></exclusion></exclusions></dependency><dependencies>
</dependencyManagement>

其它服務都繼承這個pom文件,這樣各個組件的版本就能統一起來了,將來如果某個組件要升級,直接升級這個項目的版本,其它的重新打包發布即可。

注意:

  1. 動手前一定要調研項目中使用的組件,某些組件是沒法升級的。比如ElasticSearch,驅動版本和ElasticSearch server版本要一致,升級了就會報錯。其它常見組件的有Nacos,Kafka,Mysql,RocketMQ,需要調研是否兼容低版本。
  2. 如果之前使用了Zuul 1.x作為Gateway,Zuul 2.x不開源并且難以升級,建議升級到Spring Cloud Gateway
  3. 如果使用了Zuul1.x的作為Proxy嵌入服務中,有兩個思路,一個是使用Filter+HttpClient手動寫轉發代碼,第二個思路是調研調用接口,使用Feign做轉發
  4. Spring Boot 3.x 需要JDK17,建議使用OpenJDK17,Oracle的JDK17可能存在授權問題

2. 遇到的問題

  1. Zuul1.x 升級Spring Cloud Gateway,可以參考 (Zuul遷移至Spring Cloud Gateway踩坑記錄)[https://blog.csdn.net/codeblf2/article/details/128093298] ,此記錄中服務使用的是k8s部署,轉發直接配置uri,如果使用的是Nacos,網絡上博客比較多,這里不再贅述。

  2. 如果是Spring Boot 1.x升級上來的,可能要注意循環依賴,添加以下可以解決:

    spring:main:allow-circular-references: true
    
  3. Spring Boot 3.x 支持優雅退出,添加以下配置開啟

    # 打開優雅退出
    server:shutdown: graceful
    # 多長時間后強制殺掉進程
    spring:lifecycle:timeout-per-shutdown-phase: 30s
    
  4. Beancopier可能沒法用了,可以使用BeanUtil.copyProperties替換

  5. JDK8升級到JDK17,javax包變成了jakarta,需要替換所有的javax.annotation和javax.validation等,但javax.mail沒有變,當jakarta.xxx不存在時,還是使用javax.xxx即可

  6. 如果引入外部配置文件,使用spring.cloud.bootstrap.additional-location=/data/config/bootstrap.yml,/data/config/bootstrap2.yml即可

  7. 如果依賴的一些jar中依賴一些類但由于升級,依賴類已經不存在了,典型的就是WebMvcConfigurerAdapter.class,之前是繼承WebMvcConfigurerAdapter,Spring Boot 3.x 已經改成了實現接口WebMvcConfigurer,可能會出現FileNotFoundException,此時可能難以定位是哪個jar,參考SpringBoot版本升級引起的FileNotFoundException——WebMvcConfigurerAdapter.class

  8. Spring Cloud Gateway 配置文件參考(可能遇到的問題已經寫在了注釋中):

    spring:cloud:gateway:# 默認過濾器default-filters:# 將path中第一個/xxx去掉 比如請求是 https://www.xxx.com/a/b/c?d=1# 經過這個過濾器之后就是 https://www.xxx.com/b/c?d=1- StripPrefix=1# 下面這兩個過濾器是gateway和后面的服務都配置了跨域頭,防止返同樣的回頭有多個導致跨域失敗# 典型的 access-control-allow-credentials: true,true 返回到前端導致跨域失敗- DedupeResponseHeader=access-control-allow-credentials,RETAIN_UNIQUE- DedupeResponseHeader=access-control-allow-origin,RETAIN_UNIQUEroutes:# 服務名- id: user# 轉發到的url 下面的示例是k8s內部轉發# 如果使用服務名轉發 開頭應該是lb:xxx# 這個端口后不要加任何東西 因為轉發的時候會忽略掉# 比如 http://service-user.inner:8080/aaa最后拼接出來是http://service-user.inner:8080,/aaa就忽略了uri: http://service-user.inner:8080predicates:# 匹配的請求url中的path 下面這個會匹配到 http://www.xxx.com/gateway/user/login?userName=AAA- Path=/gateway/user/**filters:# StripPrefix:去除原始請求路徑中的前1級路徑# 會把 http://www.xxx.com/gateway/service1/login中的service1去掉- StripPrefix=1# 在轉發后的url添加的前綴 經過這個filter 轉發url就變成了 http://service-user.inner:8080/service-user- PrefixPath=/service-user# 這里講一下全流程# 以請求為 http://www.xxx.com/gateway/user/login?userName=AAA為例 這個url是要登錄,登錄服務名為service-user# 斷言規則 spring.cloud.routes > predicates > Path=/gateway/user/** 能匹配到url http://www.xxx.com/gateway/user/login?userName=AAA# 第一步是默認過濾器 經過 spring.cloud.gateway.default-filters > StripPrefix=1 這個配置后就變成了 http://www.xxx.com/user/login?userName=AAA# 第二步是routers過濾器 spring.cloud.routes下的id=user的 filters > StripPrefix=1會將 http://www.xxx.com/user/login?userName=AAA的/user去掉,變成了   http://www.xxx.com/login?userName=AAA 變成# 第三步是routers過濾器 spring.cloud.routes下的id=user的 filters > PrefixPath=/service-user 會將 http://www.xxx.com/login?userName=AAA 變成 http://service-user.inner:8080/service-user服務/login?userName=AAA# 經過上面的處理后,最終會轉發到 service-user服務# response中的header如果有跨域header 會經過 spring.cloud.gateway.default-filters > DedupeResponseHeader過濾器將重復的header去掉
    

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/166298.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/166298.shtml
英文地址,請注明出處:http://en.pswp.cn/news/166298.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

歷時三個月,我發布了一款外賣返錢小程序

近幾年&#xff0c;推廣外賣紅包爆火&#xff0c;各種推廣外賣紅包的公眾號層出不窮。于是&#xff0c;我就在想外賣紅包究竟是怎么一回事。就這樣&#xff0c;我帶著問題開始了關于外賣紅包的研究。 在研究的過程中&#xff0c;我開始了解商品聯盟、推廣分成、cps等一系列相關…

網絡攻擊當搭配什么產品比較好

網絡攻擊無處不在&#xff0c;當要時刻謹記 2014年&#xff0c;索尼影業受到黑客攻擊&#xff0c;導致公司內部文件和電子郵件泄露。 2015年&#xff0c;美國聯邦政府的辦公人員信息遭到盜竊&#xff0c;影響了超過2100萬人的個人信息。 2016年&#xff0c;Yahoo的3億用戶賬…

java 中集合之一【map】,map循環

在Java中&#xff0c;常用的集合框架有以下幾個&#xff1a; 1、List&#xff08;列表&#xff09;&#xff1a;List是有序的集合&#xff0c;允許包含重復元素。常用的實現類有ArrayList和LinkedList。ArrayList是基于動態數組實現的&#xff0c;支持快速隨機訪問&#xff1b;…

android之圖片選擇器--pictureselector

推薦一個安卓圖片/視頻/文件選擇器。簡單好用。 不多廢話。直接上代碼&#xff1a; 首先&#xff0c;添加依賴&#xff1a; //圖片選擇器api io.github.lucksiege:pictureselector:v3.11.1//圖片壓縮api io.github.lucksiege:compress:v3.11.1//圖片裁剪api io.github.lucksie…

Springboot3+vue3從0到1開發實戰項目(一)

一. 可以在本項目里面自由發揮拓展 二. 知識整合項目使用到的技術 后端開發 &#xff1a; Validation, Mybatis,Redis, Junit,SpringBoot3 &#xff0c;mysql&#xff0c;Swagger, JDK17 &#xff0c;項目部署 前端開發&#xff1a; Vue3&#xff0c;Vite&#xff0c;Router…

Java數組和集合

在Java中&#xff0c;數組和集合是兩個重要的概念&#xff0c;它們用于存儲和操作數據。本文將詳細介紹Java中的數組和集合&#xff0c;包括它們的定義、初始化、訪問和常見操作 一、數組&#xff08;Array&#xff09; 數組是一種用于存儲相同類型數據的容器&#xff0c;它可…

DNS的各種進階新玩法

你們好&#xff0c;我的網工朋友&#xff0c;今天和你聊聊DNS。 01 什么是DNS&#xff1f; mac地址誕生&#xff0c;可是太不容易記憶了&#xff0c;出現了簡化了IP形式&#xff0c;它被直接暴露給外網不說&#xff0c;還讓人類還是覺得比較麻煩&#xff0c;干脆用幾個字母算了…

【Git】一文教你學會 submodule 的增、刪、改、查

添加子模塊 $ git submodule add <url> <path>url 為想要添加的子模塊路徑path 為子模塊存放的本地路徑 示例&#xff0c;添加 r-tinymaix 為子模塊到主倉庫 ./sdk/packages/online-packages/r-tinymaix 路徑下&#xff0c;命令如下所示&#xff1a; $ git subm…

用自己熱愛的事賺錢,是多么的幸福

挖掘天賦可能有些困難&#xff0c;但挖掘愛好就簡單多啦&#xff01;最幸福的事情就是能用自己喜歡的事情賺錢。 我們要說的是一個博主&#xff0c;他非常喜歡騎自行車&#xff0c;雖然他的工作是在外貿公司做銷售&#xff0c;但每當有空時&#xff0c;他都會騎自行車。而且他…

Nginx同時支持Http和Https的配置詳解

當配置Nginx同時支持HTTP和HTTPS時&#xff0c;需要進行以下步驟&#xff1a; 安裝和配置SSL證書&#xff1a; 獲得SSL證書&#xff1a;從可信任的證書頒發機構&#xff08;CA&#xff09;或使用自簽名證書創建SSL證書。 將證書和私鑰保存到服務器&#xff1a;將SSL證書和私鑰…

spring 的事務隔離;Spring框架的事務管理的優點

文章目錄 說一下 spring 的事務隔離&#xff1f;Spring框架的事務管理有哪些優點&#xff1f;你更傾向用哪種事務管理類型&#xff1f; 聊一聊spring事務的隔離&#xff0c;事務的隔離對于一個系統來說也是非常重要的&#xff0c;直接上干貨&#xff01;&#xff01;&#xff0…

Python與設計模式--享元模式

10-Python與設計模式–享元模式 一、網上咖啡選購平臺 假設有一個網上咖啡選購平臺&#xff0c;客戶可以在該平臺上下訂單訂購咖啡&#xff0c;平臺會根據用戶位置進行 線下配送。假設其咖啡對象構造如下&#xff1a; class Coffee:name price 0def __init__(self,name):se…

Go iota簡介

當聲明枚舉類型或定義一組相關常量時&#xff0c;Go語言中的iota關鍵字可以幫助我們簡化代碼并自動生成遞增的值。本文檔將詳細介紹iota的用法和行為。 iota關鍵字 iota是Go語言中的一個預定義標識符&#xff0c;它用于創建自增的無類型整數常量。iota的行為類似于一個計數器…

數據庫基礎入門 — SQL排序與分頁

我是南城余&#xff01;阿里云開發者平臺專家博士證書獲得者&#xff01; 歡迎關注我的博客&#xff01;一同成長&#xff01; 一名從事運維開發的worker&#xff0c;記錄分享學習。 專注于AI&#xff0c;運維開發&#xff0c;windows Linux 系統領域的分享&#xff01; 本…

[深度理解] 重啟 Splunk Search Head Cluster

1: 背景: 關于釋放Splunk search head 的job 運行壓力:splunk search head cluster 要重啟的話,怎么辦? 答案是:splunk rolling-restart shcluster-members Initiate a rolling restart from the command line Invoke the splunk rolling-restart command from any me…

3款免費次數多且功能又強大的國產AI繪畫工具

hi&#xff0c;同學們&#xff0c;本期是我們第55 期 AI工具教程 最近兩個月&#xff0c;國內很多AI繪畫軟件被關停&#xff0c;國外絕大部分AI繪畫工具費用不低&#xff0c;因此 這兩天我 重新整理 國產 AI繪畫 工具 &#xff0c; 最終 篩選了 3款功能強大&#xf…

LeeCode前端算法基礎100題(3)- N皇后

一、問題詳情&#xff1a; 按照國際象棋的規則&#xff0c;皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。 n 皇后問題 研究的是如何將 n 個皇后放置在 nn 的棋盤上&#xff0c;并且使皇后彼此之間不能相互攻擊。 給你一個整數 n &#xff0c;返回所有不同的 n 皇后…

虛擬機系列:vmware和Oracle VM VirtualBox虛擬機的區別,簡述哪一個更適合我?以及相互轉換

一. VMware和Oracle VM VirtualBox虛擬機的區別主要體現在以下幾個方面: 首先兩種軟件的安裝使用教程如下: VMware ESXI 安裝使用教程 Oracle VM VirtualBox安裝使用教程 商業模式:VMware是一家商業公司,而Oracle VM VirtualBox是開源軟件; 功能:VMware擁有更多的功能和…

Leetcode200. 島嶼數量

Every day a Leetcode 題目來源&#xff1a;200. 島嶼數量 解法1&#xff1a;深度優先搜索 設目前指針指向一個島嶼中的某一點 (i, j)&#xff0c;尋找包括此點的島嶼邊界。 從 (i, j) 向此點的上下左右 (i1,j)&#xff0c;(i-1,j)&#xff0c;(i,j1)&#xff0c;(i,j-1) …

“圓柱-計算公式“技術支持網址

該軟件可以計算圓柱的底面圓周長、底面積、側面積和體積。 您在使用中有遇到任何問題都可以和我們聯系。我們會在第一時間回復您。 郵箱地址&#xff1a;elmo30zeongmail.com 謝謝&#xff01;