性能提升,SpringBoot 3.2虚拟线程来了

这篇具有很好参考价值的文章主要介绍了性能提升,SpringBoot 3.2虚拟线程来了。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

spring boot 3.2 会提供默认支持,必须Java19+。
在以往的项目中,我们面临了这样一种情况:我们收到了数千个认证请求。为了确保安全性,我们依靠第三方系统发送短信 OTP 进行验证。然而,有时候第三方系统花费的时间比预期的要长,导致延迟。我们采用了每个请求一个线程的模型,这意味着许多线程处于等待状态,并且新请求都在队列中。我们试图通过微调线程数量来优化性能,但当时我们希望有虚拟线程功能。当时 Java 中没有虚拟线程的概念,这就是 Project Loom 的作用。

springboot3.2,spring boot,后端,java

虚拟线程
什么是 Project Loom?
什么是 Project Loom?这是 Oracle 的一个新项目,主要目标是显著减少编写、维护和观察高吞吐量并发应用程序的工作量。换句话说,Project Loom 旨在支持和推进一个高吞吐量、轻量级的 Java 并发模型,因为传统的操作系统线程(Java 并发模型的核心)有一些缺点,并且在计算上相当昂贵。反之,虚拟线程是更轻量级的线程,不与操作系统线程连接(由 JVM 管理)。这意味着虚拟线程是“每请求对应一个线程”编程的理想选择,可以创建大量的虚拟线程,而不会降低吞吐量。开发人员可以使用现有的 JDK 工具和技术快速排除故障、调试和分析并发应用程序,在发布的 Spring Boot 3.1 中可用。作为 Spring 开发者,了解虚拟线程的概念并理解它们在开发过程中的重要性非常关键。

如何使用虚拟线程
Java 版本选择
Java 19 中引入的虚拟线程非常易于使用,笔者使用的 Mac M1 系列,这里选择 Azul Zulu 发行版 20.30.11 版本[1]

springboot3.2,spring boot,后端,java

azul 20
创建测试项目
springboot3.2,spring boot,后端,java

使用 Spring Initializer 或 IDE 创建项目。添加 spring-web 依赖项并添加元数据。(注意版本选择 SpringBoot 3.1 ,Java 20)

开启虚拟线程功能
springboot3.2,spring boot,后端,java

默认报错
默认情况下, Java19 的虚拟线程功能是禁用状态的,需要通过相关 maven 编译配置开启。

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <compilerArgs>--enable-preview</compilerArgs>
    </configuration>
  </plugin>

通过配置 bean 启用虚拟线程

 @Bean
 TomcatProtocolHandlerCustomizer<?> threadExecutorCustomizer() {
  return protocolHandler -> protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
 }

这个 Bean 是一个自定义的 Tomcat 协议处理器,负责处理 Spring Boot 应用程序中传入的请求。这个自定义程序的目的是配置协议处理器使用的执行器。

在 threadExecutorCustomizer 方法内部,使用 Lambda 表达式来自定义协议处理器。protocolHandler 参数代表正在自定义的 Tomcat 协议处理器的实例。

在 Lambda 表达式中,调用 protocolHandler 对象的 setExecutor() 方法,用于为协议处理器设置执行器。执行器负责执行任务,例如处理传入的请求。

在这种情况下,使用 Executors.newVirtualThreadPerTaskExecutor() 方法创建一个新的使用虚拟线程的执行器。虚拟线程是轻量级线程,可以在单个操作系统线程中并发执行任务。这意味着可以同时执行多个任务,提高性能和资源利用率。

增加测试端点

@Slf4j
@RequestMapping
@RestController
public class DemoController {
    @GetMapping("/")
    public String demo() {
        try {
            TimeUnit.MILLISECONDS.sleep(300);
        } catch (InterruptedException e) {
            log.error(e.getMessage());
        }
        return "Current Thread Name: " + Thread.currentThread();
    }
}

上手使用
我们可以通过 Thread.currentThread() API 获取当前请求线程的元信息,以判断虚拟线程是否已经正确开启。

springboot3.2,spring boot,后端,java

性能测试对比
100 线程测试
不开启虚拟线程
springboot3.2,spring boot,后端,java

吞吐量 300/s
开启虚拟线程
springboot3.2,spring boot,后端,java

吞吐量 300/s
300 线程测试
不开启虚拟线程
springboot3.2,spring boot,后端,java

吞吐量 650/s
开启虚拟线程
springboot3.2,spring boot,后端,java

吞吐量 950/s
500 线程测试
不开启虚拟线程
springboot3.2,spring boot,后端,java

吞吐量 650/s
开启虚拟线程
springboot3.2,spring boot,后端,java

吞吐量 1500/s
图表输出
springboot3.2,spring boot,后端,java

springboot3.2,spring boot,后端,java

总结
通过以上我们发现,在处理阻塞操作时,虚拟线程特别有益。 随着并发请求数量的增加,虚拟线程的性能提升越来越明显
。上述测试都是在未对 Spring Boot 项目进行调优和优化的情况下进行的。文章来源地址https://www.toymoban.com/news/detail-788655.html

到了这里,关于性能提升,SpringBoot 3.2虚拟线程来了的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • WPF线程使用详解:提升应用性能和响应能力

    在WPF应用程序开发中,线程的合理使用是保证应用性能和响应能力的关键。WPF提供了多种线程处理方式,包括UI线程、后台线程、Task/Async Await和BackgroundWorker。这些方式与传统的Thread类相比,更加适用于WPF框架,并能够简化线程操作。下面将详细介绍这些线程方式的特点以及与

    2024年02月15日
    浏览(50)
  • Java21 + SpringBoot3使用Spring Security时如何在子线程中获取到认证信息

    目录 前言 原因分析 解决方案 方案1:手动设置线程中的认证信息 方案2:使用 DelegatingSecurityContextRunnable 创建线程 方案3:修改 Spring Security 安全策略 通过设置JVM参数修改安全策略 通过 SecurityContextHolder 修改安全策略 总结 近日心血来潮想做一个开源项目,目标是做一款可以适

    2024年02月19日
    浏览(30)
  • 解密JavaScript的异步机制:打破单线程限制,提升性能与用户体验

     🎬 江城开朗的豌豆 :个人主页  🔥 个人专栏  :《 VUE 》 《 javaScript 》  📝  个人网站  :《 江城开朗的豌豆🫛 》  ⛺️ 生活的理想,就是为了理想的生活 !   目录 一、JavaScript的异步编步机制 二、事件循环(Event Loop)和任务队列(Task Queue) 三、宏任务和微任务

    2024年02月08日
    浏览(33)
  • uniapp小程序如何通过虚拟列表配合节流,完成上拉刷新下拉加载,避免页面卡顿,提升性能呢?

    本文将介绍uniapp小程序中如何使用虚拟列表和节流两种技术实现上拉刷新下拉加载功能,同时避免因渲染大量数据导致的页面卡顿问题。 一、虚拟列表 在uniapp小程序开发中,当我们需要渲染大量列表数据时,很容易出现页面卡顿现象。这时候,我们可以使用虚拟列表技术来

    2024年02月11日
    浏览(36)
  • 性能比较 - Spring Boot 应用程序中的线程池与虚拟线程 (Project Loom)

            本文比较了 Spring Boot 应用程序中的不同请求处理方法:ThreadPool、WebFlux、协程和虚拟线程 (Project Loom)。         在本文中,我们将简要描述并粗略比较可在 Spring Boot 应用程序中使用的各种请求处理方法的性能。         高效的请求处理在开发高性能后端应

    2024年02月12日
    浏览(34)
  • SpringBoot中启用虚拟线程

    虚拟线程是JDK21版本正式发布的一个新特性。虚拟线程和平台线程主要区别在于,虚拟线程在运行周期内不依赖操作系统线程:它们与硬件脱钩,因此被称为“虚拟”。这种解耦是由JVM提供的抽象层赋予的。 虚拟线程的运行成本远低于平台线程。它们消耗的内存要少得多。这

    2024年02月08日
    浏览(23)
  • Spring Boot虚拟线程与Webflux在JWT验证和MySQL查询上的性能比较

    早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,我就不翻译了,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。 作者采用了一个尽可能贴近现实操作的场景: 从授权头信息中提取JWT 验证JWT并从中提取用户的Email 使用用

    2024年02月08日
    浏览(40)
  • Linux性能学习(3.2):IO_磁盘IO

    参考资料: 1. Linux I/O模型 2. 判断磁盘I/O是否饱和与%util指标的意义 3. 磁盘利用率和饱和度 4. 辩证看待 I/Ostat 在上一篇中,大致了解了文件系统的一些知识,了解了不同的文件系统以及VFS的概念,其实在存储介质上也是有这个情况,在嵌入式开发中,会根据不同的项目使用不

    2024年02月08日
    浏览(46)
  • SpringBoot3之配置文件(学习SpringBoot3的配置这一篇足够)

    1.1 SpringBoot3简介 SpringBoot 帮我们简单、快速地创建一个独立的、生产级别的 Spring 应用(说明:SpringBoot底层是Spring) ,大多数 SpringBoot 应用只需要编写少量配置即可快速整合 Spring 平台以及第三方技术! SpringBoot的主要目标是: 为所有 Spring 开发提供更快速、可广泛访问的入

    2024年01月18日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包