記錄springboot從1.5.10升級到2.0.0過程中遇到的問題(上)

寫在開頭

隨著springboot2.0.0的正式版本的已經(jīng)發(fā)布,準備把公司的基于springboot的框架從1.5.10版本升級到2.0.0的第一個正式版本,在過程中遇到了很多問題,有的是自己的問題, 有的是springboot、springcloud 或者其他組件的問題。下面就記錄一下在這個過程中遇到的問題,以及相關的解決方案,方便以后進行回顧

現(xiàn)狀

現(xiàn)在大部分都是依附于springboot的starter作為組件形式進行開發(fā),starter的模塊很多,下面按模塊記錄到底改動了什么東西, 以及為什么要進行修改。

參考資料

大部分的參考資料都是springboot的官方wiki的文檔
Springboot Migration文檔地址

項目結構升級

  1. 之前的項目的版本管理和升級是通過maven的 rg.codehaus.mojo:versions-maven-plugin 來進行升級的, 每次都需要執(zhí)行腳本來替換所有的pom里面的version,后面發(fā)現(xiàn)maven 3.5+ 之后可以通過在父項目定義revision變量字段,然后利用flatten-maven-plugin 的插件來完成一處定義,簡化了升級版本的步驟,和影響范圍。

配置文件的定義的改動

  1. 之前配置文件的一些前綴使用的駝峰的寫法,現(xiàn)在在代碼中springboot2要求一定要使用 - 來進行單詞的分隔, 所以在代碼層面統(tǒng)一做了一次改變。 不過有一點好的就是,之前配置中心統(tǒng)一使用的也是駝峰的寫法,這個地方springboot2自動進行了轉換,所以配置文件可以保持不動。
  2. 讀取配置文件轉換成對象, 通過新增的Binder對象來進行轉換,操作也方便了很多。但是讀取寫死的配置文件和讀取占位符的配置文件方法有所不同
    對于寫死的配置文件可以用
new Binder(ConfigurationPropertySources.from(environment.getPropertySources()))
          .bind(targetName, Bindable.of(clazz))
          .orElseThrow(
              () -> new FatalBeanException("Could not bind DataSourceSettings properties"));

上面的方法沒辦法加載placeholder表達式的配置文件,所以可以通過

Binder.get(environment).bind(targetName, Bindable.of(clazz)).orElseThrow(
          () -> new FatalBeanException("Could not bind DataSourceSettings properties"));

來獲取帶有placeholder表達式的配置文件
現(xiàn)在官方的wiki里面已經(jīng)更新相關函數(shù)。建議使用第二種方式

優(yōu)雅關閉tomcat的改動

  1. 每次服務關閉的時候, 都需要等待運行的進行正常進行關閉, 由于springboot2加入了webflux的原因,之前的tomcat的相關類都進行了改動,所以shutdown相關的代碼也要進行改動,不過就是一些類的改變, 整體改動不是很大

數(shù)據(jù)庫相關的改動

  1. 這一塊的改動比較大, 因為之前通過BeanFactoryPostProcessor類來讀取配置文件動態(tài)加載數(shù)據(jù)源的方式,所以之前是通過加載tomcat-pool來加載的, 現(xiàn)在為hikari,所以數(shù)據(jù)池初始化的代碼都需要改動
  2. 之前tomcat-pool提供了一些監(jiān)控和日志的功能,但是hikari為了速度這些功能都沒有了,所以通過引入了log4jdbc來完成了數(shù)據(jù)庫訪問日志的補充
  3. 把之前的mysql的datasource和mybatis的初始化進行了分離, 為了后續(xù)的orm框架的接入

redis相關的改動

  1. 由于之前redis操作的封裝是直接通過jedisCluster或者jedis來進行訪問的, 由于redis的底層依賴被切換到lettuce,所以放棄使用jedis相關的操作,改成直接使用spring-data-redis所提供的template來完成。
  2. 在代碼層面統(tǒng)一了redis-single和redis-cluster的使用方式,而是通過不同的配置來區(qū)分redis是否是集群,從而達成只能選擇的模式。
  3. 通過對于RedisCacheManager的重載,來重新定義了序列化的方式,并且自定義了RedisCacheWriter對于redis失效的情況下繼續(xù)訪問底層的操作
  4. 在改動的過程中發(fā)現(xiàn)了spring-data-redis的一些嚴重的bug,并且給官方進行了上報,目前應該在springboot2的正式版本已經(jīng)修復。

actuator的相關變動

  1. 現(xiàn)在所有的actuator接口都統(tǒng)一增加了/actuator的前綴
  2. 所有的endpoints的配置全部移動到managent下面了,可以在managent進行不同endpoints的配置
  3. cors相關的配置也移動到了managent下面
  4. endpoints的安全也設置也可以通過繼承WebSecurityConfigurerAdapter類來完成代碼層面的設置

項目

下面的項目是一部分實驗形式的項目,脫離的公司的代碼, 可以幫助大家進行遷移,后續(xù)會繼續(xù)進行更新
loc-framework 項目可以幫助大家進行一些學習, 希望得到大家的支持

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容