老项目升级 JDK 21 + SpringBoot 3.2 体验
老项目升级 JDK 21 + SpringBoot 3.2 体验
改造过程
本项目是一个 3000 多行的 springboot 小项目, 原来是 jdk11 + springboot2.
花了几个小时, 过程是:
下载安装最新版本的 idea, 否则可能不支持 jdk21 的新特性
安装 jdk21
idea 文件 -> 项目结构, 修改本项目的 jdk 版本和语言级别
升级 jdk, springboot, docker 镜像的版本
将包名中的 javax 改为 jakarta
将 swagger2 升到 3
主要改动是注解(例如从
@ApiOperation
升级为@Operation
)我不太喜欢这套新注解, 感觉功能上没有什么增强, 徒增改造成本和学习成本. 不过 springboot3 只支持 openapi3, 那就只好改了.
不过这种破坏式升级的好处是: 以前需要用户修修补补才能解决的问题可以在新版本彻底解决. 新用户安装配置非常简单.
ElasticSearch 换用新的 api
原来的
NativeSearchQuery
没有了, 要用新的NativeQuery
, 感觉新 api 的写法挺别扭的.阿里云 oss 和短信代码改造
原来用了阿里云封装好的一个 starter, 这个 starter 在 springboot3 似乎有点问题,官方 sdk 也不是很优雅。强烈推荐用 sms4j,开源短信集成工具,降低学习成本
修改 application.yml 中的 redis 配置, 从
spring.redis
变成了spring.data.redis
, 上线后才发现这个问题, 很坑.
使用虚拟线程替代线程池处理请求。我们不再使用线程池去处理请求, 而是为每一个请求创建一个新的虚拟线程. 虚拟线程的开销是很小的, 这意味着请求线程数将不再是并发量的瓶颈。springboot 3.2 开始完全支持 jdk21,启用虚拟线程很简单:只需要在 application.yml 中将 `spring.threads.virtual.enabled`设置为 true 即可。
mybtais plus 需要升级到 3.5.5 以上的版本,否则启动会报错。依赖如下:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.5</version>
</dependency>
改造效果
因为是小项目, 用户量并不大, 虚拟线程的并发性能并没有得到很好的发挥, 也许以后会有用吧!
启动速度提升明显(原因未知, 如果有知道的朋友望不吝赐教). 原来在本地启动需要 6 秒, 现在只需要 2 秒. 大项目的提升可能会更明显. 于提升开发/测试的体验, 你的单元测试可以更快地得到验证.
一些新版本 jdk 的语法糖和新的 api, 比如多行文本, switch 表达式等
再也不用估算线程池参数了, java 会帮我们实现最佳调度方案