看压测结果,Java21虚拟线程真滴强!
一、前言
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
2023-09-22
2023-09-21
2023-06-21
2023-09-20