一张图看懂:Spring Boot 如何处理请求?Java 21 虚拟线程又带来了什么?

【Java 21虚拟线程实战】基于Project Loom的协程革命,让你的Java应用性能提升10倍 学习教程(传送门)本人详解作者:王文峰,参加过 优快云 2020年度博客之星,《Java王大师王天师》公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯转载说明:务必注明来源(注明:作者:王文峰哦)【Java 21虚拟线程实战】基于Project Loom的协程革命,让你的Java应用性能提升10倍学习教程(传送门)学习教程(传送门)往期文章学习教程(传送门)1、掌握入门到进阶知识( 阅读详情

作者:旷野说
定位:Spring Boot 开发者速查手册 + 高并发架构认知指南
关键澄清:Spring Boot 默认使用 Spring Web MVC + 内嵌 Tomcat,不是“替代”,而是“自动化集成”


一、Spring Boot 的请求处理链(底层仍是 Tomcat + Servlet)

当你写一个 Spring Boot 应用:

@SpringBootApplication
public class MyApp {
    public static void main(String[] args) {
        SpringApplication.run(MyApp.class, args); // 启动内嵌 Tomcat
    }
}

@RestController
class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello!";
    }
}

背后发生了什么?

📦 请求处理流程(Spring Boot 默认栈)

graph LR
    A[Client] --> B[Tomcat Acceptor]
    B --> C[Tomcat Poller (NIO)]
    C --> D[Worker 线程(执行 Servlet)]
    D --> E[Spring Web MVC DispatcherServlet]
    E --> F[@RestController 方法]
  • Spring Boot 自动配置:
    • 内嵌 Tomcat 作为 Web 容器;
    • 注册 DispatcherServlet(Spring Web MVC 的核心);
    • 将 @RestController 映射为 Servlet 处理逻辑。

✅ Spring Web MVC 没有过时 —— 它是 Spring Boot Web 能力的基石。
Spring Boot 只是屏蔽了 XML 配置,让你用注解 + 自动装配快速开发。


二、Java 21 革命:虚拟线程如何提升 Spring Boot 性能?

🔑 三大优势(针对 I/O 密集型服务)

优势说明
轻虚拟线程创建成本极低,可支撑10万+并发
挂调用 DB/HTTP 阻塞时,自动挂起,不占 OS 线程
复底层 OS 线程被 JVM 自动复用,CPU 利用率更高

🛠️ 在 Spring Boot 中启用虚拟线程(3.2+)

// src/main/java/com/example/config/VirtualThreadConfig.java
@Configuration
public class VirtualThreadConfig {

    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> enableVirtualThreads() {
        return factory -> {
            factory.addConnectorCustomizers(connector -> {
                var protocol = connector.getProtocolHandler();
                if (protocol instanceof AbstractProtocol) {
                    ((AbstractProtocol<?>) protocol).setExecutor(
                        Executors.newVirtualThreadPerTaskExecutor() // 关键!
                    );
                }
            });
        };
    }
}

💡 效果:每个 HTTP 请求由一个虚拟线程执行,不再受限于传统线程池(如 200 线程瓶颈)。


三、虚拟线程 + Spring Boot:三种典型用法

场景推荐方案优势
1. 普通 REST API(调用 DB/Feign)直接写同步代码,启用虚拟线程✅ 代码简单,性能接近异步
2. 并行调用多个服务CompletableFuture + 虚拟线程 Executor✅ 避免阻塞主线程池
3. 必须用 WebFlux(如流式响应)Reactor + 虚拟线程 Scheduler(桥接阻塞库)✅ 保留响应式优势,兼容旧代码

示例:并行调用(虚拟线程版)

@GetMapping("/profile")
public CompletableFuture<Profile> getProfile() {
    Executor vtExecutor = Executors.newVirtualThreadPerTaskExecutor();
    
    var userFuture = CompletableFuture.supplyAsync(userService::me, vtExecutor);
    var ordersFuture = CompletableFuture.supplyAsync(orderService::recent, vtExecutor);
    
    return userFuture.thenCombine(ordersFuture, Profile::new);
}

四、对比速查表:传统 vs 虚拟线程(Spring Boot 环境)

维度传统线程模型(JDK 17-)虚拟线程模型(JDK 21+)
Spring Boot 默认是(Worker 线程池)需手动启用
最大并发(I/O 密集)~200(受 maxThreads 限制)>10,000(受内存限制)
代码风格同步(MVC)或异步(WebFlux)同步代码即可高并发
适用技术栈Spring Web MVC / WebFluxSpring Web MVC + 虚拟线程 = 最佳性价比

🟢 结论:
对于 90% 的微服务(CRUD + 远程调用),Spring Boot + Web MVC + 虚拟线程 是最简单且高性能的选择。


🧵 终极口诀:Spring Boot 虚拟线程三三三

一栈三件:Boot、MVC、Tomcat;
虚拟三字:轻、挂、复;
用法三策:简、融、择。

详解:

  1. 一栈三件:
    Spring Boot Web 应用 = Spring Boot(启动) + Spring Web MVC(路由/控制器) + 内嵌 Tomcat(网络层)。

  2. 虚拟三字:

    • 轻:线程轻量;
    • 挂:I/O 自动挂起;
    • 复:OS 线程复用。
  3. 用法三策:

    • 简:简单业务用同步代码 + 虚拟线程;
    • 融:复杂场景融合 CompletableFuture;
    • 择:按 I/O or CPU 密集选模型。

✅ 开发建议(2025 年起)

  • ✅ 新项目(JDK 21+):默认启用虚拟线程,优先使用 @RestController(Web MVC);
  • ✅ 遗留系统升级:只需加 10 行配置,吞吐量提升 10 倍;
  • ❌ 不要:为了“时髦”强行上 WebFlux(除非真有流式/背压需求);
  • 💡 监控:使用 jcmd <pid> VM.virtual_thread_stats 查看虚拟线程状态。

🔚 结语

Spring Boot 从没有抛弃 Spring Web MVC —— 它只是让它更好用。
而 Java 21 的虚拟线程,则让它更快。

简单 + 高性能 = 开发者的终极理想。

把这篇博客收藏起来,下次做技术选型或性能调优时,
看一眼“三三三口诀”,你就知道该怎么选。


📌 环境要求:

  • JDK 21 或更高
  • Spring Boot 3.2+
  • 内嵌容器:Tomcat 10.1+ / Jetty 12+ / Undertow 2.3+

愿你的 Spring Boot 应用,既简洁,又飞快。 🚀

Spring Boot 虚拟线程 vs WebFlux:谁更胜一筹? Spring Boot 虚拟线程和 WebFlux 都是构建可扩展应用的强大工具,但各自适用于不同的需求场景。虚拟线程凭借其简洁性、兼容性和以最小改动实现高并发处理的能力,成为大多数项目的首选方案。它为传统 Spring MVC 应用带来了革命性改变,在保持简单性的同时提供了接近响应式的性能表现。而WebFlux在需要超低延迟或流处理的特殊场景中仍然具有不可替代的价值,其响应式模型在这些领域表现卓越。对于 2025 年的大多数开发者而言,虚拟线程在性能和开发效率之间找到了最佳平衡点,使其成为默认选择。 阅读详情

相关推荐

Spring Boot 3 + Java 21 全新特性实战:虚拟线程、结构化并发与 Record 类型

摘要:本文探讨了Java 21与Spring Boot 3.2+结合带来的现代开发优势,重点介绍了虚拟线程、结构化并发和Record类型三大特性。通过环境准备和项目初始化,展示了如何在Spring Boot中应用Record简化DTO和JPA查询。详细解析了虚拟线程的高并发优势及其在Web应用中的配置,对比了与传统线程模型的性能差异。最后介绍了结构化并发如何解决传统并发编程问题,强调其通过作用域管理提升代码安全性。这些特性共同助力构建高性能、可维护的现代Java应用。

Selegant的博客 1177

【Java21】在spring boot中使用虚拟线程

摘要:本文介绍了在Spring Boot 3.3.3中如何启用虚拟线程(Virtual Thread)及其原理。通过配置spring.threads.virtual.enabled=true,系统会自动在Tomcat、Redis、RabbitMQ、Kafka等组件中使用虚拟线程。Spring Boot通过@ConditionalOnThreading注解实现平台线程与虚拟线程的动态切换。文章还分析了虚拟线程的适用场景,包括异步任务、定时任务等,并提示了使用虚拟线程的5个注意事项:避免线程池化、改用信号量控制

qq_45362415的博客 2037

JDK21虚拟线程初窥:从平台线程到轻量级并发革命

从早期的重量级线程到线程池优化,再到如今JDK21推出的虚拟线程(Virtual Threads),Java正在重塑高并发应用的开发范式13。虚拟线程与传统平台线程最显著的区别在于资源消耗。当虚拟线程执行阻塞操作时,JVM会自动挂起当前线程并调度其他虚拟线程执行,显著提升CPU利用率35。正如一位资深架构师所说:"虚拟线程让Java找回了'一个请求一个线程'的简单之美,同时解决了其资源消耗问题,这是并发编程的文艺复兴。虚拟线程的引入不仅改变了Java并发编程的方式,更将重塑微服务架构的设计思路。

Mi_RenYu的博客 1万+

Java 21虚拟线程与Spring Boot 3.2集成实战指南

虚拟线程是Java平台引入的轻量级线程,由JVM管理而非操作系统。轻量级:创建和销毁成本极低高密度:可同时运行数百万个虚拟线程自动调度:由JVM而非操作系统调度Java 21虚拟线程与Spring Boot 3.2的结合为现代应用开发带来了显著的性能提升和资源利用率优化。虚拟线程的核心概念与优势Spring Boot中的集成配置方法实际应用场景与性能监控最佳实践与常见陷阱随着虚拟线程技术的成熟,它将成为构建高并发应用的标配。建议从小规模试点开始,逐步验证效果后再扩大应用范围。

Momo__omoM的博客 1233

升级 Spring Boot 3 配置讲解 — JDK 23 会给 SpringBoot 带来什么特性?

JDK 23 为 Spring Boot 带来了许多令人兴奋的新特性,如虚拟线程、模式匹配的增强以及新的 API 和库。通过升级到 JDK 23 和 Spring Boot 3,你可以充分利用这些新特性,提升应用的性能和开发效率。希望本文能帮助你顺利升级并利用这些新特性。如果你在升级过程中遇到任何问题,欢迎在评论区留言讨论。

让 Java 再次伟大! 1798

Spring Boot + 虚拟线程实现的二维码生成器

随着的发布,虚拟线程(Virtual Threads)成为了正式特性,彻底改变了 Java 的并发编程方式。它们为传统线程提供了更轻量、更易扩展的替代方案,让开发者能够编写出更加简洁高效的并发代码。

程序猿DD 1068

Java 21 虚拟线程详解

虚拟线程内存占用低:无需为每个虚拟线程分配一个独立的操作系统线程,降低了系统资源消耗。高效上下文切换:由 JVM 内部调度管理,不涉及昂贵的 OS 级别线程切换,能更好地应对高并发场景。简而言之,虚拟线程可看作是“任务(Task)”,它们运行在传统的操作系统线程之上,但在代码层面与常规线程使用方式完全一致。为了避免因无限制并发导致 OOM 或对下游系统产生巨大压力,可借助信号量(Semaphore)和阻塞队列实现自定义虚拟线程池。/*** 构造函数。

yuanmomoya的博客 2903

内网环境下的高德地图离线化实战:从瓦片下载到交互功能集成

本文详细介绍了在内网环境中部署离线高德地图的完整实战方案。针对军工、能源、金融等对网络隔离与数据安全有严格要求的场景,文章核心解决了离线地图的两大基石:地图瓦片数据的高效下载与本地化,以及高德地图JS API的获取与插件集成。通过具体代码示例,进一步讲解了如何实现地图初始化、海量点标注与聚合、自定义图标及框选查询等核心交互功能,并分享了内网部署的路径配置、性能优化及法律合规等关键注意事项,为开发者在封闭网络环境下构建稳定、可控的地图应用提供了清晰指南。

Apple的专栏 395

Java 21 虚拟线程 vs. 传统线程:Spring Boot 实战指南

本指南将通过一个 Spring Boot 应用,演示传统线程与虚拟线程之间的实际差异,展示虚拟线程如何在不受物理线程限制的情况下,轻松处理成千上万的并发请求。通过理解传统线程与虚拟线程之间的差异,开发者可以在构建应用程序时,做出更明智的技术选型决策。因为虚拟线程并不会提高 CPU 密集型任务的性能,这类任务需要与 CPU 核心数匹配的线程数才能最高效。或网络 I/O)时,JVM 会自动挂起它,并让底层的 OS 线程去执行其他任务,而不是空等。,线程在阻塞时不会占用 OS 线程,可以去执行其他任务。

郑龙飞 1295

GoDaddy域名解析 到 阿里云域名DNS

一:登录GODaddy,点击“个人中心”,然后点击“管理域名” 二:域名解析 第一种:直接解析到对应的服务器 添加一个,类型默认A,主机填写二级域名前缀(image.主域名),指向填写目标服务器ip即可(注意目标服务器80端口是否开放) 第二种:将主域名dns转到阿里云域名下 三:若要修给为阿里云解析服务器,要做以下修改,点击“更改” 点击更改后出现如下页面,此时需要到阿里云官网云解析DNS下添加域名解析 四:阿里云添加域名解析...

xiaolinzi176的博客 6706

Pico设备手势追踪实战:5步搞定MRTK3手部模型与UI交互配置

本文详细介绍了在Pico设备上使用MRTK3实现手势追踪的5个关键步骤,包括环境配置、手部模型冲突解决、射线交互优化、UI交互配置及性能优化。通过实战案例和代码示例,帮助开发者快速解决MR开发中的常见问题,提升混合现实应用的交互体验。

onion的博客 499

Java 21 虚拟线程(Virtual Threads)完全指南:从原理到实战

Java 21虚拟线程彻底革新并发模型:通过M:N调度机制,实现千万级并发的同时保持同步编程体验。本文详解虚拟线程原理(用户态线程+自动挂载/卸载)、性能对比(8倍QPS提升)、Spring Boot实战改造(零代码改动)及最佳实践(避免synchronized阻塞),帮助开发者突破传统线程限制。

yu779的博客 2584

LLC谐振变换器中的软开关艺术:ZVS与ZCS的协同设计

本文深入解析了LLC谐振变换器如何通过巧妙的电路设计,协同实现零电压开关(ZVS)与零电流开关(ZCS),从而大幅降低开关损耗与电磁干扰,提升电源效率。文章结合设计实战,详细阐述了谐振参数计算、器件选型及调试避坑指南,为高效、高功率密度电源设计提供了核心思路与解决方案。

weixin_29216957的博客 350

Java 生态的 2026 下半年趋势——虚拟线程、GraalVM 与 Spring Boot 4 展望

从 2024 年 Java 21 正式发布虚拟线程(Virtual Threads)至今,经过近两年的生产环境验证,这项特性已经从"实验性尝鲜"进入"生产默认选项"阶段。但它的落地过程并非一帆风顺——我们在一线观察到的最常见问题集中在三个方面:线程固定(Pinning)、ThreadLocal 滥用导致的资源泄漏,以及与连接池类库的兼容性。虚拟线程的核心价值在于让"每个请求一个线程"的一线程一连接(Thread-per-Request)模型重新变得可行。

alex_goden的博客 5977

FMC/FSMC/EXMC总线NORFlash/PSRAM接口(异步-复用-不突发/同步-复用-突发)

目录 1 简介 1.1 框图 1.2 接口定义 1.3 读写时序图、时序配置参数 1.4 PSRAM控制器异步工作模式分类 1.5 PSRAM寄存器配置 1.5.1 控制寄存器BCR 1.5.2 片选时序寄存器BTR 1.5.3 写入时序寄存器BWTR 2 FPGA接口设计 2.1 实际配置的时序 2.2 接口信号处理 3 参考文献 1 简介 使...

leixj的博客 2万+

SE (3) -Transformers:三维旋转 - 平移等变注意力网络

E (3) 变换器,这是一种用于三维点云和图的自注意力模块变体,在连续三维旋转平移下具有等变性。注意力机制的计算量会随着点云规模的增大呈二次方增长,因此引入邻域的概念是很有必要的:每个点不再关注所有其他点,而只关注其最近的邻点。注意力机制此前已在图的领域中以内部注意力、自注意力、顶点注意力或图注意力等名称被引入 [17, 31, 32, 12, 26]。等变性意味着当输入数据发生旋转或平移时,模型的输出也会以相应的、可预测的方式进行变换,从而保证模型性能的稳定性和可预测性。

qq_49786473的博客 1482

Spring Boot 中的虚拟线程

虚拟线程是 Java 19 中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能。作为 Java 生态中的革命性进展,虚拟线程让我们可以在不增加操作系统资源负担的情况下,创建成千上万个线程。在这篇文章中,我们将探讨虚拟线程的基本概念、如何在 Spring Boot 中启用和使用虚拟线程,并探讨它们如何改善高并发任务的处理。

qq_36291550的博客 1697

VSCode多文件C语言项目编译实战:从配置到运行

本文详细讲解了如何在VSCode中配置多文件C语言项目的编译环境。通过手把手教学,指导读者创建项目结构、编写代码,并重点深度配置task.json与launch.json文件,实现一键编译和调试所有C文件,解决常见的“undefined reference”等链接错误,提升开发效率。

g8f9d0s1a2的博客 1098

【Java 21 + Spring Boot性能革命】:虚拟线程池配置的5大核心要点

掌握Spring Boot的虚拟线程池配置,提升高并发性能。基于Java 21虚拟线程特性,详解适用场景、配置方式、与传统线程对比优势及最佳实践。轻松实现资源优化与响应提速,值得收藏

FastCompile的博客 902

13《CAN总线五种错误类型,故障判定全解析》

CAN总线规定,发送节点在发送完EOF字段后,会留出一个ACK Slot(应答槽)。这个槽里,发送节点自己会输出隐性电平(逻辑1),然后“期待”至少有一个其他节点在这个槽里把它拉成显性电平(逻辑0)。如果这个槽结束时仍然是隐性电平,发送节点就判定:刚才那帧报文,没有任何一个节点成功接收——这就是应答错误。简单说,就是“我喊了一嗓子,却没人应声”。

2401_88858637的博客 265

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

虚拟线程(Virtual Threads)使用指南(Java 21+)

核心创建方式:快速使用用,自定义属性用,有返回值任务用Future。线程池首选:实际开发优先使用虚拟线程池,无需配置线程数,支持自动关闭。实战落地:Spring Boot 3.2 + 可通过简单配置实现 Web 服务和异步任务的虚拟线程改造,无需修改业务代码。使用边界:仅适用于阻塞式 I/O 任务、高并发轻量任务,避免 CPU 密集型任务和过度使用 ThreadLocal。

weixin_45483057的博客 2056

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Java虚拟线程】Java21、SpringBoot3中使用虚拟线程

1、虚拟线程是Java19提出来的一个概念,Java19提供特性预览,开放实装是Java21(2023年9月),目前来说(2024年3月),还是一个比较新的特性,对于一些不是很常见的库可能尚未适配。2、虚拟线程主要解决的问题是减少I/O密集型任务的I/O阻塞。传统的多线程在处理I/O的时候,例如某个线程在处理某个任务,如果遇到I/O例如网络通信文件读取,受限于网络速度机器的硬盘I/O速度等,这个线程会阻塞等待I/O的完成,然后再继续往下执行任务。

m0_74824635的博客 1704

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

【Java21】在spring boot中使用ScopedValue

本文介绍了Java 21预览功能ScopedValue在Spring Boot Web项目中的应用。ScopedValue具有不可变性和作用域限制的特点,适合在虚拟线程环境中替代ThreadLocal。文章通过具体示例演示了如何配置Maven启用预览功能,并实现通过HTTP过滤器将请求头信息存入ScopedValue上下文,在Controller和Service层读取该上下文数据。测试结果表明,ScopedValue能有效传递上下文信息,且在虚拟线程环境下同样适用。代码示例已开源在GitHub上。

qq_45362415的博客 1517

虚拟线程:Java 并发的新利器

虚拟线程,比普通线程更加轻量级的线程!!😀

qq_56158663的博客 1451

从 Spring Boot 3+Java 21 到 Spring Boot 4+Java 25:迁移全指南

SpringBoot4正式发布,基于SpringFramework6.2和Java25 LTS版本,为开发者带来新特性与性能提升。本文提供迁移指南:1)环境准备需升级JDK25+及构建工具;2)重点关注核心依赖版本变更;3)适配SpringBoot4的自动配置简化、Web层调整等破坏性变更;4)利用Java25虚拟线程、字符串模板等新特性优化代码;5)通过兼容性测试和性能基准测试确保平稳过渡。文末附迁移Checklist和版本对照表,建议分阶段验证并迁移。

★【World Of Moshow 郑锴】★ 6680

Spring Boot 启用虚拟线程

如果你看到了完整的 Spring Boot 日志,你会发现日志中的虚拟线程的线程名称是空的:虚拟线程的名称为空这是因为 Spring Boot 默认获取的是Thread的name属性作为线程名称,而默认情况下虚拟线程的name为空。

2508_92159502的博客 1884
上一篇: SSO、账号密码和短信验证码我都要-Spring Security 的认证多源登录简记
下一篇: 面试官问:maven 版本冲突管理的原理是什么,一句话描述下?
旷野说
博客等级 码龄9年 361粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值