老项目升级 JDK 21 + SpringBoot 3.2 体验

改造过程

本项目是一个 3000 多行的 springboot 小项目, 原来是 jdk11 + springboot2.

花了几个小时, 过程是:

  1. 下载安装最新版本的 idea, 否则可能不支持 jdk21 的新特性

  2. 安装 jdk21

  3. idea 文件 -> 项目结构, 修改本项目的 jdk 版本和语言级别

  4. 升级 jdk, springboot, docker 镜像的版本

  5. 将包名中的 javax 改为 jakarta

  6. 将 swagger2 升到 3

    主要改动是注解(例如从@ApiOperation升级为@Operation)

    我不太喜欢这套新注解, 感觉功能上没有什么增强, 徒增改造成本和学习成本. 不过 springboot3 只支持 openapi3, 那就只好改了.

    不过这种破坏式升级的好处是: 以前需要用户修修补补才能解决的问题可以在新版本彻底解决. 新用户安装配置非常简单.

  7. ElasticSearch 换用新的 api

    原来的 NativeSearchQuery没有了, 要用新的NativeQuery, 感觉新 api 的写法挺别扭的.

  8. 阿里云 oss 和短信代码改造

    原来用了阿里云封装好的一个 starter, 这个 starter 在 springboot3 似乎有点问题,官方 sdk 也不是很优雅。强烈推荐用 sms4j,开源短信集成工具,降低学习成本

  9. 修改 application.yml 中的 redis 配置, 从spring.redis变成了spring.data.redis, 上线后才发现这个问题, 很坑.

  1. 使用虚拟线程替代线程池处理请求。我们不再使用线程池去处理请求, 而是为每一个请求创建一个新的虚拟线程. 虚拟线程的开销是很小的, 这意味着请求线程数将不再是并发量的瓶颈。springboot 3.2 开始完全支持 jdk21,启用虚拟线程很简单:只需要在 application.yml 中将 `spring.threads.virtual.enabled`设置为 true 即可。

  2. 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 会帮我们实现最佳调度方案

文章作者: 白烛魁
本文链接:
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 白烛魁的小站
Java
喜欢就支持一下吧