Mall電商實戰專案全面升級!支援最新版SpringBoot,徹底解決迴圈依賴...

macrozheng發表於2022-07-05
前不僅,SpringBoot 2.7.0 版本釋出了,我也是第一時間把之前開源的腳手架專案mall-tiny 給升級支援了!有的小夥伴提出把mall專案也升級下,於是我最近抽空把它給升級了!不僅是支援了最新版SpringBoot,使用到的技術棧基本都升級到最新了!今天分享下升級內容和升級過程中遇到的一些問題,大家可以參考下!

SpringBoot實戰電商專案mall(50k+star)地址:https://github.com/macrozheng/mall

技術棧升級

mall專案採用現階主流技術實現,這些主流技術基本都升級了目前最新穩定版,具體升級內容大家可以參考下表。

技術版本說明
SpringBoot2.3.0->2.7.0容器+MVC框架
SpringSecurity5.1.4->5.7.1認證和授權框架
MyBatis3.4.6->3.5.9ORM框架
MyBatisGenerator1.3.3->1.4.1資料層程式碼生成
RabbitMQ3.7.14->3.10.5訊息佇列
Redis5.0->7.0分散式快取
MongoDB4.2.5->5.0NoSql資料庫
Elasticsearch7.6.2->7.17.3搜尋引擎
LogStash7.6.2->7.17.3日誌收集工具
Kibana7.6.2->7.17.3日誌視覺化檢視工具
Nginx1.10->1.22靜態資源伺服器
Druid1.1.10->1.2.9資料庫連線池
MinIO7.1.0->8.4.1物件儲存
Hutool5.4.0->5.8.0Java工具類庫
PageHelper5.2.0->5.3.0MyBatis物理分頁外掛
Swagger-UI2.9.2->3.0.0文件生成工具
logstash-logback-encoder5.3->7.2Logstash日誌收集外掛
docker-maven-pluginspotify->fabric8應用打包成Docker映象的Maven外掛

升級過程

升級過程中遇到一些問題,這裡整理了下,給想要升級這套技術棧的小夥伴一個參考!

支援SpringBoot 2.7.0

看了下之前使用的2.3.0版本,一年前就End of Support了,升級2.7.0還是很有必要的。

升級2.7.0版本不僅是改個版本號就行了,由於SpringBoot2.6.x版本開始預設禁用了迴圈依賴,如果你的專案中迴圈依賴太多的話,只能使用如下配置開啟了。

spring:
  main:
    allow-circular-references: true

既然官方都禁止使用了,我們還是從源頭上解決迴圈依賴的好,如何優雅地解決迴圈依賴問題具體可以參考mall-tiny升級支援SpringBoot 2.7.0 中的解決迴圈依賴部分,mall專案也使用了這種優雅的方式。

Swagger改用Starter

之前專案中是直接使用Swagger依賴來整合的,並沒有用Starter,這次改用了它。

<!--Swagger-UI API文件生產工具-->
<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

在升級SpringBoot 2.6.x版本的時候,其實Swagger就有一定的相容性問題,需要在配置中新增BeanPostProcessor這個Bean,具體可以參考升級 SpringBoot 2.6.x 版本後,Swagger 沒法用了

SpringSecurity用法升級

在升級SpringBoot2.7.0版本後,SpringSecurity中有個重要的類被棄用了,那就是一直作為配置類使用的WebSecurityConfigurerAdapter

新用法非常簡單,無需再繼承WebSecurityConfigurerAdapter,只需直接宣告配置類,再配置一個生成SecurityFilterChainBean的方法,把原來的HttpSecurity配置移動到該方法中即可,mall專案也採用了這種新用法。

/**
 * SpringSecurity 5.4.x以上新用法配置
 * 為避免迴圈依賴,僅用於配置HttpSecurity
 * Created by macro on 2022/5/19.
 */
@Configuration
public class SecurityConfig {

    @Bean
    SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
        //省略HttpSecurity的配置
        return httpSecurity.build();
    }

}

最新版Spring Security用法具體可以參考Spring Security 最新用法

MyBatis升級

在升級MyBatis的過程中,也升級了MySQL的驅動版本,從8.0.16升級到了8.0.29

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.29</version>
</dependency>

之前有小夥伴提出升級到該版本後,在Linux上無法連線到MySQL資料庫,其實是因為預設使用了SSL連線導致的,在配置檔案中新增useSSL=false配置即可解決。

spring:
  datasource:
    url: jdbc:mysql://db:3306/mall?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
    username: reader
    password: 123456

ELK日誌收集系統升級

其實每次升級SpringBoot版本,如果整合了Elasticsearch都基本要升級ES,然後整套ELK元件都得升級,這次全部升級到了7.17.3版本。

為什麼升級該版本呢?因為SpringBoot2.7.0使用的Java SDK預設相容該版本。

不得不說ES的Java SDK各版本相容性很差,如果還是使用之前的7.6.2版本的話,執行mall-search中的單元測試程式碼會出現如下問題。很多小夥伴使用ES出現一些稀奇古怪的問題,大概率是版本相容性問題。

看一眼升級後的日誌收集系統,Kibana的介面更現代化了!

MongoDB升級

MongoDB升級5.0用法基本和之前一致,但是在部署到Docker環境時發現,MongoDB5.0居然需要特定CPU支援,只得改用4.x版本了。

映象打包外掛改用fabric8io

之前一直使用的是spotify出品的docker-maven-plugin,用於打包應用Docker映象並上傳到伺服器。上了下官網,這個外掛基本上是不維護了,之前也有小夥伴反饋使用有問題。

現在改用了fabric8出品的docker-maven-plugin,功能更強大,更新也比較及時。

雖然外掛換了,但用法還是一樣的,配置好docker遠端訪問地址後直接雙擊package命令就可以實現一鍵打包上傳應用映象了。

部署文件更新

專案的部署文件也同步更新了,具體可以參考以下連結。

  • mall在Windows環境下的部署
https://www.macrozheng.com/ma...
  • mall在Linux環境下的部署(基於Docker容器)
https://www.macrozheng.com/ma...
  • mall在Linux環境下的部署(基於Docker Compose)
https://www.macrozheng.com/ma...

總結

今天分享了一下mall專案的升級內容和升級過程中遇到的一些問題,不得不說,SpringBoot確實是個很棒的框架,跨了幾個大版本升級到2.7.0,程式碼幾乎無需改動。SpringBoot 2.7 版本很可能成為一個釘子戶版本,因為從SpringBoot 3.0 開始最低要求Java 17了,大家可以嘗試下升級到該版本!

專案原始碼地址

開源不易,覺得專案有幫助的小夥伴點個Star支援下吧!

https://github.com/macrozheng...

相關文章