0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Spring Boot 3.2支持虚拟线程和原生镜像

jf_ro2CN3Fa 来源:medium.com 2023-11-30 16:22 次阅读

来源:medium.com/@egorponomarev

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 已经做到完全支持了。

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

虚拟线程

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

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

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

我们将使用Spring Initializr页面创建一个新的Spring Boot项目,使用 Spring Boot 3.2.0、Java 21、Gradle-Groovy以及Spring Web和GraalVM本地支持依赖项。

要在 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")
publicclassTestController{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(TestController.class);

@GetMapping
publicvoidtest(){
log.info("Restcontrollermethodhasbeencalled{}",Thread.currentThread());
}
}

2.异步任务

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

@Component
publicclassAsyncTaskExecutorService{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(AsyncTaskExecutorService.class);

@Async
publicvoidrun(){
log.info("Asynctaskmethodhasbeencalled{}",Thread.currentThread());
}
}

3.Scheduled 定时任务

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

@Component
publicclassSchedulerService{
privatestaticfinalLoggerlog=LoggerFactory.getLogger(SchedulerService.class);

@Scheduled(fixedDelayString="15000")
publicvoidrun(){
log.info("Scheduledmethodhasbeencalled{}",Thread.currentThread());
}
}

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

./gradlewbootRun

并调用我们的端点

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

我们得到什么:

StartingAppApplicationusingJava21.0.1withPID38126
StartedAppApplicationin1.131seconds(processrunningfor1.491)
AsynctaskmethodhasbeencalledVirtualThread[#52,task-1]/runnable@ForkJoinPool-1-worker-5
ScheduledmethodhasbeencalledVirtualThread[#46,scheduling-1]/runnable@ForkJoinPool-1-worker-1
RestcontrollermethodhasbeencalledVirtualThread[#62,tomcat-handler-0]/runnable@ForkJoinPool-1-worker-1
ScheduledmethodhasbeencalledVirtualThread[#46,scheduling-1]/runnable@ForkJoinPool-1-worker-1

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

根据JEP:预期行为:

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

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

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

./gradlewnativeCompile

./build/native/nativeComplie/app

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

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

结论

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

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

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102994
  • 线程
    +关注

    关注

    0

    文章

    489

    浏览量

    19495
  • 镜像
    +关注

    关注

    0

    文章

    153

    浏览量

    10587
  • SpringBoot
    +关注

    关注

    0

    文章

    172

    浏览量

    106

原文标题:Spring Boot 3.2 正式发布,开箱即用的虚拟线程和 GraalVM,尝鲜一下!

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Spring Boot如何实现异步任务

    上,用来告诉 Spring 这个方法是一个异步方法,Spring 会将这个方法的执行放在异步线程中进行。使用 @Async 注解需要满足以下条件: 需要在 Spring
    的头像 发表于 09-30 10:32 487次阅读

    Spring Boot虚拟线程和Webflux性能对比

    早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。
    发表于 09-24 14:54 294次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b><b class='flag-5'>虚拟</b><b class='flag-5'>线程</b>和Webflux性能对比

    使用Spring Boot 3.2虚拟线程搭建静态文件服务器

    Spring Boot 3.2 于 2023 年 11 月大张旗鼓地发布,标志着 Java 开发领域的一个关键时刻。这一突破性的版本引入了一系列革命性的功能。
    的头像 发表于 01-09 09:34 573次阅读
    使用<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> <b class='flag-5'>3.2</b><b class='flag-5'>虚拟</b><b class='flag-5'>线程</b>搭建静态文件服务器

    请问6455支持对16位flash操作吗?

    求教!最近在使用6455,EMIF的CE3空间接了16位的flash用来boot程序。第一个问题6455支持对16位flash操作吗?我用的异步16位通信方式,不能正确操作flash,我从网上没有
    发表于 01-22 07:42

    请问STM32支持ISP下载吗?

    STM32支持ISP下载吗?
    发表于 02-12 08:12

    STM32支持仿真器和串口下载程序

    STM32支持仿真器和串口下载程序。将要介绍的内容,属于串口下载,即我们通常说的ISP下载。手动ISP下载程序,我们已经知道了,控制BOOT0引脚实现。STM32上电,会自动检测BOOT0引脚
    发表于 01-27 08:17

    CH9121的虚拟串口软件在哪?CH9120支持吗?

    CH9121的虚拟串口软件在哪?CH9120支持
    发表于 10-17 06:45

    Spring Boot从零入门1 详述

    在开始学习Spring Boot之前,我之前从未接触过Spring相关的项目,Java基础还是几年前自学的,现在估计也忘得差不多了吧,写Spring
    的头像 发表于 12-10 22:18 417次阅读

    Spring Boot特有的实践

    Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验
    的头像 发表于 09-29 10:24 643次阅读

    强大的Spring Boot 3.0要来了

    和 Bugfix。 Spring Boot 3.0 的开发工作始于实验性的 Spring Native,旨在为 GraalVM 原生镜像提供
    的头像 发表于 10-31 11:17 1174次阅读

    用这4招 优雅的实现Spring Boot异步线程间数据传递

    Spring Boot 自定义线程池实现异步开发相信看过陈某的文章都了解,但是在实际开发中需要在父子线程之间传递一些数据,比如用户信息,链路信息等等
    的头像 发表于 01-30 10:40 807次阅读

    Spring干掉原生JVM?

    这意味着,除了 Spring 诞生以来就支持的 Java 虚拟机,官方添加了使用 GraalVM 将 Spring 应用编译成原生
    的头像 发表于 05-05 09:25 353次阅读
    <b class='flag-5'>Spring</b>干掉<b class='flag-5'>原生</b>JVM?

    Spring Boot Actuator快速入门

    不知道大家在写 Spring Boot 项目的过程中,使用过 Spring Boot Actuator 吗?知道 Spring
    的头像 发表于 10-09 17:11 340次阅读

    Spring Boot的启动原理

    可能很多初学者会比较困惑,Spring Boot 是如何做到将应用代码和所有的依赖打包成一个独立的 Jar 包,因为传统的 Java 项目打包成 Jar 包之后,需要通过 -classpath 属性
    的头像 发表于 10-13 11:44 369次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的启动原理

    Spring Boot 的设计目标

    什么是Spring Boot Spring BootSpring 开源组织下的一个子项目,也是 S
    的头像 发表于 10-13 14:56 309次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的设计目标