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

語言: CN / TW / HK

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

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

技術棧升級

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

| 技術 | 版本 | 說明 | | ------------------------ | ---------------- | --------------------- | | SpringBoot | 2.3.0->2.7.0 | 容器+MVC框架 | | SpringSecurity | 5.1.4->5.7.1 | 認證和授權框架 | | MyBatis | 3.4.6->3.5.9 | ORM框架 | | MyBatisGenerator | 1.3.3->1.4.1 | 資料層程式碼生成 | | RabbitMQ | 3.7.14->3.10.5 | 訊息佇列 | | Redis | 5.0->7.0 | 分散式快取 | | MongoDB | 4.2.5->5.0 | NoSql資料庫 | | Elasticsearch | 7.6.2->7.17.3 | 搜尋引擎 | | LogStash | 7.6.2->7.17.3 | 日誌收集工具 | | Kibana | 7.6.2->7.17.3 | 日誌視覺化檢視工具 | | Nginx | 1.10->1.22 | 靜態資源伺服器 | | Druid | 1.1.10->1.2.9 | 資料庫連線池 | | MinIO | 7.1.0->8.4.1 | 物件儲存 | | Hutool | 5.4.0->5.8.0 | Java工具類庫 | | PageHelper | 5.2.0->5.3.0 | MyBatis物理分頁外掛 | | Swagger-UI | 2.9.2->3.0.0 | 文件生成工具 | | logstash-logback-encoder | 5.3->7.2 | Logstash日誌收集外掛 | | docker-maven-plugin | spotify->fabric8 | 應用打包成Docker映象的Maven外掛 |

升級過程

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

支援SpringBoot 2.7.0

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

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

yaml spring:   main:     allow-circular-references: true

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

Swagger改用Starter

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

```xml

    io.springfox     springfox-boot-starter     3.0.0 ```

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

SpringSecurity用法升級

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

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

```java /*  * 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

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

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

yaml 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環境下的部署

http://www.macrozheng.com/mall/deploy/mall_deploy_windows.html

  • mall在Linux環境下的部署(基於Docker容器)

http://www.macrozheng.com/mall/deploy/mall_deploy_docker.html

  • mall在Linux環境下的部署(基於Docker Compose)

http://www.macrozheng.com/mall/deploy/mall_deploy_docker_compose.html

總結

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

專案原始碼地址

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

http://github.com/macrozheng/mall

「其他文章」