看压测结果,Java21虚拟线程真滴强!

JAVA架构日记

共 3271字,需浏览 7分钟

 · 2023-09-27

一、前言

Java 21 发布了!在 Spring Boot 3.2 中,可以通过配置 spring.threads.virtual.enabled=true 设置为开启虚拟线程。

当然目前 Spring Boot 3.2 还没有正式发布,我们是否可以在低版本的 Spring boot 中开启虚拟线程呢?答案是肯定的,笔者在 Spring boot 3.1.4 甚至在 Spring boot 2.7.15 中成功开启虚拟线程。下面跟着我一起去试试吧。

二、开启虚拟线程

在 Spring boot 3.1.4 中需要手动配置开启虚拟线程,我们先来看看 tomcat 的开启方式。

@Configuration(proxyBeanMethods = false)
public class VirtualThreadConfiguration {

 @Bean
 public TomcatProtocolHandlerCustomizer<ProtocolHandler> tomcatProtocolHandlerCustomizer() {
  return protocolHandler -> protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
 }

}

注意:VirtualThreadConfiguration 配置类不要使用 @AutoConfiguration,笔者用它一直不生效。

然后编写一个 api 接口:

@RestController
public class ApiController {

    @GetMapping
    public String api() throws InterruptedException {
        // 模拟耗时 300ms
        TimeUnit.MILLISECONDS.sleep(300);
        return LocalDateTime.now() + " Thread: " + Thread.currentThread();
    }

}

请求和响应:

$ curl -s http://localhost:8080/
2023-09-22T17:36:43.183296300 Thread: VirtualThread[#70]/runnable@ForkJoinPool-1-worker-4

Undertow 开启虚拟线程:

@Bean
public UndertowDeploymentInfoCustomizer undertowDeploymentInfoCustomizer() {
 return deploymentInfo -> deploymentInfo.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
}

配置 Spring 异步为虚拟线程:

@Bean
public AsyncTaskExecutor asyncTaskExecutor() {
    return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());
}

三、效果

笔者采用 go-wrk 简单进行了单元测试,10000 个请求,分别按 100、300、500、1000 个并发进行测试。总耗时结果如下图:从图中可以看到在并发度越高,虚拟线程优势越明显,总耗时越少。在 1000 并发时总耗时减少了5倍多

四、项目实战

基于PIG微服务开发平台 jdk21 快照分支( Java21、SpringBoot 3.2、Spring Cloud 2023),对 OAuth2.0 生成 Token 端点进行了压力测试。

在同时处理 200 个请求的情况下,开启虚拟线程后,响应时间和吞吐量均提升了两倍以上。


五、总结

如果你的服务访问量非常大,而接口访问耗时较高,那么一个值得考虑的升级方案是将其迁移到 Java21,并尝试开启虚拟线程功能。


虚拟线程是一种轻量级的线程实现方式,可以显著提高多线程应用程序的性能和扩展性。


使用虚拟线程的好处是可以同时运行大量的线程,而无需消耗过多的系统资源。与传统的操作系统线程相比,虚拟线程的创建和销毁成本更低,因此可以更快地响应客户端的请求。这意味着你的服务可以处理更多的并发请求,提高整体的吞吐量,并减少用户等待的时间。


PIG 基于 Spring Boot 3.1、Spring Cloud 2022 和 Alibaba、Spring Authorization Server 的微服务快速开发平台已适配 Java21版本的新特性注意选择 jdk17-dev、java21 分支。您可以下载源码进行参考。

  • 部署文档:https://wiki.pig4cloud.com


Spring Boot 3.1.4 发布,正式支持 Java21

2023-09-22

等等党有福了, Java21 来了

2023-09-21

性能提升 200% !SpringBoot 虚拟线程来了

2023-06-21

遥遥领先,PIGX + JDK17 + SpringBoot 3生态版本发布

2023-09-20


浏览 1686
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报