寫在開頭
隨著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文檔地址
項目結構升級
- 之前的項目的版本管理和升級是通過maven的
rg.codehaus.mojo:versions-maven-plugin來進行升級的, 每次都需要執(zhí)行腳本來替換所有的pom里面的version,后面發(fā)現(xiàn)maven 3.5+ 之后可以通過在父項目定義revision變量字段,然后利用flatten-maven-plugin的插件來完成一處定義,簡化了升級版本的步驟,和影響范圍。
配置文件的定義的改動
- 之前配置文件的一些前綴使用的駝峰的寫法,現(xiàn)在在代碼中springboot2要求一定要使用 - 來進行單詞的分隔, 所以在代碼層面統(tǒng)一做了一次改變。 不過有一點好的就是,之前配置中心統(tǒng)一使用的也是駝峰的寫法,這個地方springboot2自動進行了轉換,所以配置文件可以保持不動。
- 讀取配置文件轉換成對象, 通過新增的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的改動
- 每次服務關閉的時候, 都需要等待運行的進行正常進行關閉, 由于springboot2加入了webflux的原因,之前的tomcat的相關類都進行了改動,所以shutdown相關的代碼也要進行改動,不過就是一些類的改變, 整體改動不是很大
數(shù)據(jù)庫相關的改動
- 這一塊的改動比較大, 因為之前通過
BeanFactoryPostProcessor類來讀取配置文件動態(tài)加載數(shù)據(jù)源的方式,所以之前是通過加載tomcat-pool來加載的, 現(xiàn)在為hikari,所以數(shù)據(jù)池初始化的代碼都需要改動 - 之前tomcat-pool提供了一些監(jiān)控和日志的功能,但是hikari為了速度這些功能都沒有了,所以通過引入了log4jdbc來完成了數(shù)據(jù)庫訪問日志的補充
- 把之前的mysql的datasource和mybatis的初始化進行了分離, 為了后續(xù)的orm框架的接入
redis相關的改動
- 由于之前redis操作的封裝是直接通過jedisCluster或者jedis來進行訪問的, 由于redis的底層依賴被切換到lettuce,所以放棄使用jedis相關的操作,改成直接使用spring-data-redis所提供的template來完成。
- 在代碼層面統(tǒng)一了redis-single和redis-cluster的使用方式,而是通過不同的配置來區(qū)分redis是否是集群,從而達成只能選擇的模式。
- 通過對于RedisCacheManager的重載,來重新定義了序列化的方式,并且自定義了RedisCacheWriter對于redis失效的情況下繼續(xù)訪問底層的操作
- 在改動的過程中發(fā)現(xiàn)了spring-data-redis的一些嚴重的bug,并且給官方進行了上報,目前應該在springboot2的正式版本已經(jīng)修復。
actuator的相關變動
- 現(xiàn)在所有的actuator接口都統(tǒng)一增加了
/actuator的前綴 - 所有的endpoints的配置全部移動到managent下面了,可以在managent進行不同endpoints的配置
- cors相關的配置也移動到了managent下面
- endpoints的安全也設置也可以通過繼承
WebSecurityConfigurerAdapter類來完成代碼層面的設置
項目
下面的項目是一部分實驗形式的項目,脫離的公司的代碼, 可以幫助大家進行遷移,后續(xù)會繼續(xù)進行更新
loc-framework 項目可以幫助大家進行一些學習, 希望得到大家的支持