SpringBoot 3.2正式版,开箱即用的虚拟线程和GraalVM,尝鲜一下!

Spring Boot 3.2 近日刚刚发布,让我们用 Java 21、GraalVM 和虚拟线程来尝试一下。

Spring Boot 3.2 支持:

  • Java 21

  • 虚拟线程

  • 原生镜像(自 2022 年 11 月 Spring Boot 3.0 发布以来,Spring Boot 已在生产环境中支持 GraalVM 原生镜像)

Java 21

我们期待 2023 年 9 月 19 日发布的 Java 21,Spring Boot 3.2 已经做到完全支持了。

Java21部分新特性:https://mp.weixin.qq.com/s/f8HonH72YxIgWN8De6U0Jg

正如所声明的那样,Java 21 提供了数千项性能、稳定性和安全性改进,包括平台增强功能,可帮助开发人员提高生产力并推动整个组织的创新和增长。

虚拟线程

更重要的更新之一是虚拟线程,这是 Project Loom 提供的功能。我们不打算深入细节,官方 JEP 提供了很好的解释:

https://openjdk.org/jeps/444

GraalVM和本机镜像

GraalVM 是一种高性能 JDK,可以使用替代的即时 (JIT) 编译器来加快 Java 和基于 JVM 的应用程序的性能。

Native Image 是一种提前将 Java 代码编译为独立可执行文件(称为本机映像)的技术。该可执行文件包括应用程序类、其依赖项中的类、运行时库类以及来自 JDK 的静态链接本机代码。

它不在 Java VM 上运行,但包含来自不同运行时系统的必要组件,如内存管理、线程调度等。与 JVM 相比,生成的程序具有更快的启动时间和更低的运行时内存开销。

尝鲜一下

让我们从安装 Java 21.0.1 graal 开始,最简单的方法是使用SDKMAN 并将其指定为您机器的默认 Java 版本:

  • sdk install java 21.0.1-graal

  • sdk default java 21.0.1-graal

另一种安装方法是手动下载

https://www.graalvm.org/downloads/

我们将使用Spring Initializr页面创建一个新的Spring Boot项目,使用 Spring Boot 3.2.0、Java 21、Gradle-Groovy以及Spring Web和GraalVM本地支持依赖项。另外,推荐公众号Java精选,回复java面试,获取面试资料,支持随时随地刷题。

要在 Spring Boot 3.2 中启用虚拟线程,我们只需在 application.yml 或 application.properties 文件中设置一个属性:

spring.threads.virtual.enabled:true

这个配置起到的作用:

  • Tomcat 将使用虚拟线程来处理 HTTP 请求。这意味着处理 Web 请求的应用程序代码(例如控制器中的方法)将在虚拟线程上运行。

  • 调用@Async方法时,Spring MVC 的异步请求处理和 Spring WebFlux 的阻塞执行支持现在将利用虚拟线程

  • 标记有@Scheduled的方法将在虚拟线程上运行

因此,我们将尝试使用这 3 个集成来实现虚拟线程。

此外,一些特定的集成将在虚拟线程上工作,例如 RabbitMQ/Kafka 监听器,以及 Spring Data Redis/Apache pulsar 相关的集成。但这些集成超出了本文的范围,有兴趣的可以参考 Spring Boot 3.2 官方示例。

代码

1.对于Tomcat传入HTTP请求,我们创建一个简单的控制器:

@RestController
@RequestMapping("/test")
public class TestController {
    private static final Logger log = LoggerFactory.getLogger(TestController.class);

    @GetMapping
    public void test() {
        log.info("Rest controller method has been called {}", Thread.currentThread());
    }
}

2.异步任务

我们将在应用程序启动时调用其“run”方法

@Component
public class AsyncTaskExecutorService {
    private static final Logger log = LoggerFactory.getLogger(AsyncTaskExecutorService.class);

    @Async
    public void run() {
        log.info("Async task method has been called {}", Thread.currentThread());
    }
}

3.Scheduled定时任务

一个简单的方法,每 15 秒调用一次

@Component
public class SchedulerService {
    private static final Logger log = LoggerFactory.getLogger(SchedulerService.class);

    @Scheduled(fixedDelayString = "15000")
    public void run() {
        log.info("Scheduled method has been called {}", Thread.currentThread());
    }
}

让我们运行我们的应用程序:

./gradlew bootRun

并调用我们的端点

curl — 位置 — 请求 GET 'localhost:8085/test'

我们得到什么:

Starting AppApplication using Java 21.0.1 with PID 38126
Started AppApplication in 1.131 seconds (process running for 1.491)
Async task method has been called VirtualThread[#52,task-1]/runnable@ForkJoinPool-1-worker-5
Scheduled method has been called VirtualThread[#46,scheduling-1]/runnable@ForkJoinPool-1-worker-1
Rest controller method has been called VirtualThread[#62,tomcat-handler-0]/runnable@ForkJoinPool-1-worker-1
Scheduled method has been called VirtualThread[#46,scheduling-1]/runnable@ForkJoinPool-1-worker-1

我们可以看到我们的方法的日志链接到公共 ForkJoinPool 线程池。

根据JEP:预期行为:

JDK 的虚拟线程调度程序是一个工作窃取的 ForkJoinPool,它以 FIFO 模式运行。调度程序的并行度是可用于调度虚拟线程的平台线程的数量。

现在让我们在 GraalVM 上运行它。

首先,我们需要构建一个 GraalVM 本机映像:(此命令可能需要几分钟)然后运行:(使用您的应用程序的名称而不是“app”)

./gradlew nativeCompile

./build/native/nativeComplie/app

它也可以工作,并且启动时间要快得多,这符合声明的“与 JVM 相比,生成的程序具有更快的启动时间和更低的运行时内存开销”。

在这里您可以找到包含本文中使用的代码的存储库来源:

https://github.com/egor-ponomarev/spring-boot3.2-with-graalvm-virtual-threads-example

代码

Spring Boot 3.2 是我们一直在等待的东西!具有虚拟线程的本机映像允许我们编写能够提供与 Go 类似级别的性能和可扩展性的代码,从而保持 JVM 的强大生态系统。

但是,您必须考虑到并非所有库都已采用其代码来与虚拟线程正常工作(在大多数情况下,它正在用 ReentrantLock 替换“synchronize”块),您应该小心虚拟线程将使用的逻辑。

来源|https://medium.com/@egorponomarev

<think>嗯,用户问的是Spring Boot 3.2升级到3.3的影响修改点。我需要先确认Spring Boot 3.3的更新内容,特别是那些可能对现有项目造成影响的变更。首先,应该查阅官方发布的迁移指南,或者查看版本更新的文档。记得Spring Boot通常会Spring Framework以及其他依赖项的版本一起更新,所以可能需要检查这些依赖的兼容性。 接下来,Java版本的支持情况。Spring Boot 3.2可能需要Java 17,而3.3是否仍然支持还是需要更高的版本?例如,如果用户还在用Java 11,那可能需要升级JDK,这会影响他们的环境配置。 然后,依赖管理的变化。Spring Boot每个版本可能会升级内嵌的库,比如Tomcat、Hibernate、Spring Security等。比如,Spring Boot 3.3可能使用了Spring Framework 6.1,这可能导致一些API的变化。用户需要检查他们的代码中是否有使用这些库的旧API,需要替换成新的方式。 配置属性的变动也是一个常见的问题。Spring Boot有时会弃用某些配置属性,或者重命名它们。比如,旧的配置项`server.servlet.context-path`可能在某个版本后改为`server.servlet.context-path`或者其他形式,或者被新的属性替代。用户需要检查application.properties或application.yml中的配置,替换掉已弃用的属性。 自动配置的更改也可能导致问题。比如,某些自动配置类可能被移除或修改,导致应用程序启动时出现Bean创建失败的情况。需要检查启动日志是否有相关的错误信息,或者查看自动配置的变更列表。 还有,可能引入的新特性或改进可能会影响现有功能。比如,对GraalVM原生镜像的支持是否有改进,是否需要调整构建脚本或配置。另外,如果用户使用了特定的第三方库,可能需要查看这些库是否与Spring Boot 3.3兼容,或者需要升级到新的版本。 另外,测试相关的变更也不能忽视。Spring Boot可能会更新测试框架的版本,或者改变测试的自动配置方式,导致原有的测试用例失败。需要检查测试代码,确保它们适应新版本的测试支持。 最后,构建工具的插件版本是否需要升级。比如,Maven的spring-boot-maven-plugin或者Gradle的Spring Boot插件可能需要同步升级到对应的版本,以支持新特性或修复的问题。 在用户的实际升级过程中,建议逐步进行,先升级到小版本,比如从3.2.x到3.3.0,然后测试各项功能。使用IDE的依赖管理工具来检查过时的依赖,并利用Spring Boot的启动诊断工具来发现潜在的问题。同时,单元测试集成测试的覆盖率也很重要,确保升级后核心功能不受影响。 可能还需要提醒用户注意第三方库的兼容性,比如数据库驱动、Spring Data模块、安全性库等,是否都有支持Spring Boot 3.3的版本。如果某些库还没有适配,可能需要暂时不升级,或者寻找替代方案。 总结一下,我需要分步骤列出升级的影响点,包括依赖变化、配置属性变更、废弃的API、自动配置调整、构建工具要求等,并给出相应的修改建议。同时,强调测试逐步迁移的重要性,帮助用户顺利过渡到新版本。</think>以下是Spring Boot 3.2 升级到 3.3 的主要影响及修改点,分步骤说明: --- ### 一、核心依赖升级 1. **Java版本要求** - Spring Boot 3.3 最低要求 **Java 17**(与3.2相同,但需确认项目是否兼容Java 21新特性) - 新增对Java 21虚拟线程(Virtual Threads)的更好支持 2. **Spring Framework版本** - 升级至 **Spring Framework 6.1**,需检查代码中是否依赖过时的API,例如: ```java // 旧方式(可能废弃) ResponseEntity.status(HttpStatus.OK) // 新方式(使用枚举) ResponseEntity.ok() ``` --- ### 二、配置属性变更 1. **已废弃的配置项** - `management.metrics.export.simple.enabled` 被替换为 `management.simple.metrics.export.enabled` - `spring.data.redis.repositories.enabled` 默认值从 `true` 改为 `false` 2. **新增配置项** - `spring.sql.init.continue-on-error` 支持数据库初始化错误后继续启动 - `server.ssl.bundle` 支持SSL证书捆绑配置 --- ### 三、重要功能变动 1. **依赖管理更新** - **内嵌服务器**:Tomcat 10.1.x → 10.1.20,Jetty 12 → 12.0.5 - **数据库驱动**:Hibernate 6.4 → 6.4.4,MySQL Driver 8.1 → 8.2 - **安全框架**:Spring Security 6.2 → 6.2.3 2. **GraalVM原生镜像优化** - 减少构建时间(需更新GraalVM22.3+) - 需检查 `@NativeHint` 注解是否替换为新的 `@RegisterReflectionForBinding` --- ### 四、代码修改点 1. **过时API替换** ```java // 旧方法(Spring Boot 3.2) HttpMethod.valueOf("GET"); // 新方法(Spring Boot 3.3) HttpMethod.GET; ``` 2. **响应式编程调整** - WebFlux 中 `ServerHttpResponse.writeWith()` 返回值改为 `Mono<Void>` 3. **测试框架变更** - `@SpringBootTest` 默认加载 `ApplicationContext` 的策略优化,可能需显式指定: ```java @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) ``` --- ### 五、迁移建议步骤 1. **依赖升级** ```xml <!-- pom.xml 修改 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.3.0</version> </parent> ``` 2. **配置检查** - 运行 `./mvnw spring-boot:validate-config` 或 `./gradlew validateSpringBootConfig` 检测废弃配置 3. **测试验证** - 重点关注日志中的 `WARN` 提示(如 `Configuration property &#39;xxx&#39; is deprecated&#39;`) - 验证自动配置类是否冲突(例如通过 `@ConditionalOnMissingBean`) --- ### 六、潜在风险 1. **第三方库兼容性** - 检查如MyBatis、Lombok等常用库是否兼容Spring Boot 3.3 - 示例:MyBatis 3.5.13+ 需配合 `mybatis-spring-boot-starter 3.0.3+` 2. **构建工具适配** - Gradle 8.5+ 或 Maven 3.9+ 推荐版本 --- ### 总结 升级需重点关注 **配置项变更** **依赖版本兼容性**,建议通过以下命令生成差异报告: ```bash ./mvnw versions:display-dependency-updates ``` 若遇到启动失败,可添加 `--debug` 参数查看详细日志定位问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值