Spring Boot 升级 3.2.1 踩坑指南
原服务器上的 Java Spring Boot 程序内存占用很高,服务器资源紧张,考虑使用高版本 JDK 21,并使用虚拟线程等进行优化。
Spring Boot 源版本: 2.7.4
javax 系列依赖弃用
下面大致罗列了一些需要替换的依赖
import javax.validation.constraints.NotBlank;
替换为
import jakarta.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
替换为
import jakarta.validation.constraints.Pattern;
import javax.annotation.Resource;
替换为
import jakarta.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
替换为
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import javax.validation.Valid;
替换为
import jakarta.validation.Valid;
邮件相关依赖替换
<dependency>
<groupId>jakarta.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<!-- 替换为下面 -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>jakarta.mail</artifactId>
<version>2.0.1</version>
</dependency>
Servlet 依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>compile</scope>
</dependency>
替换为
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>compile</scope>
</dependency>
Swagger 升级
之前使用的是 Knife4j,依赖了 Springfox 3.0.0,而 Springfox 3.0.0 不再更新,需要替换为 OpenAPI 3。响应代码的注解最好替换一下
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.4.0</version>
</dependency>
使用到注解的情况下排除一下之前 Swagger 的依赖,要不然不好替换原来的注解
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-annotations</artifactId>
<version>${knife4j.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
</exclusion>
<exclusion>
<artifactId>swagger-annotations</artifactId>
<groupId>io.swagger.core.v3</groupId>
</exclusion>
</exclusions>
</dependency>
注解替换参考这个 示例
配置文件修改
springdoc:
swagger-ui:
path: /swagger-ui.html
api-docs:
path: /v3/api-docs
knife4j:
enable: true
setting:
language: zh_cn
替换的注解
@ApiModel(value = "商品规格")
替换为
@Schema(description = "商品规格")
@ApiModelProperty(value = "删除状态")
替换为
@Schema(description = "删除状态")
@Api(tags = "App支付接口")
替换为
@Tag(name = "App支付接口")
@ApiOperation(value = "添加接口")
替换为
@Operation(summary ="添加接口")
注解到底能不能复用,没有测试过,我的做法是直接替换
第三方依赖升级
我们服务依赖的第三方依赖相对较少,基本依赖版本升级到 Spring Boot 3.2 就可以使用。
- Spring Cloud 版本升级
<properties>
<spring-cloud.version>2023.0.0</spring-cloud.version>
</properties>
- Forest 升级
<properties>
<forest-spring-boot-starter.version>1.5.35</forest-spring-boot-starter.version>
</properties>
<dependency>
<groupId>com.dtflys.forest</groupId>
<artifactId>forest-spring-boot3-starter</artifactId>
<version>${forest-spring-boot-starter.version}</version>
</dependency>
- Mica 升级
<mica.version>3.2.0</mica.version>
- Sa-Token 升级
Stoke 升级后可能有点 API 的变动,稍微改动下就行,
<sa-token.version>1.37.0</sa-token.version>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot3-starter</artifactId>
<version>${sa-token.version}</version>
</dependency>
MyBatis-Plus 升级
<mybatis-plus.version>3.5.5</mybatis-plus.version>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
Spring Boot 配置变动
自动配置修改
Spring Boot 3.0 之后已经弃用了 spring.factories
文件配置,需要使用以下配置方式:
目录如下,内容可以参考网上教程,这儿提一个自动生成配置的依赖:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
<dependency>
<groupId>net.dreamlu</groupId>
<artifactId>mica-auto</artifactId>
<version>3.1.2</version>
</dependency>
Redis 配置修改
spring:
data:
redis:
database: 3
host: ${REDIS_HOST:127.0.0.1}
port: ${REDIS_PORT:3306}
password: ${REDIS_PASSWORD:123456}
Redis 的配置需要添加到 spring.data
之下,要不然不生效。
虚拟线程修改
spring:
threads:
virtual:
enabled: true
Docker 镜像选择
可以自动打 Docker 镜像,我懒,直接找 OpenJDK,我就找了 eclipse-temurin
。
# Maven 选择
maven:3.9.6-eclipse-temurin-21-alpine
# JVM 运行镜像选择
eclipse-temurin:21.0.1_12-jre
实际运行效果
未升级之前
升级后
因为是测试环境,晚上的运行结果,没有什么流量,单纯看效果还行,从 1.5GB 多降低到 800 多MB。