写点什么

Mall 电商实战项目全面升级!支持最新版 SpringBoot,干掉循环依赖

作者:程序知音
  • 2022 年 7 月 02 日
  • 本文字数:2150 字

    阅读完需:约 7 分钟

前不久,SpringBoot 2.7.0 版本发布了,我也是第一时间把之前开源的脚手架项目 mall-tiny 给升级支持了!有的小伙伴提出把 mall 项目也升级下,于是我最近抽空把它给升级了!不仅是支持了最新版 SpringBoot,使用到的技术栈基本都升级到最新了!今天分享下升级内容和升级过程中遇到的一些问题,大家可以参考下!

技术栈升级

mall 项目采用现阶主流技术实现,这些主流技术基本都升级了目前最新稳定版,具体升级内容大家可以参考下表。



升级过程

升级过程中遇到一些问题,这里整理了下,给想要升级这套技术栈的小伙伴一个参考!

支持 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. */@Configurationpublic 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/mall/deploy/mall_deploy_windows.html

  • mall 在 Linux 环境下的部署(基于 Docker 容器)

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

  • mall 在 Linux 环境下的部署(基于 Docker Compose)

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

总结

今天分享了一下 mall 项目的升级内容和升级过程中遇到的一些问题,不得不说,SpringBoot 确实是个很棒的框架,跨了几个大版本升级到 2.7.0,代码几乎无需改动。SpringBoot 2.7 版本很可能成为一个钉子户版本,因为从 SpringBoot 3.0 开始最低要求 Java 17 了,大家可以尝试下升级到该版本!

项目源码地址

开源不易,觉得项目有帮助的小伙伴点个 Star 支持下吧!

用户头像

程序知音

关注

还未添加个人签名 2022.06.25 加入

还未添加个人简介

评论

发布
暂无评论
Mall电商实战项目全面升级!支持最新版SpringBoot,干掉循环依赖_Java_程序知音_InfoQ写作社区