一张图看懂: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的博客 2904

Java实战:用Proj4j搞定WGS84与CGCS2000坐标互转(附完整代码)

本文详细介绍了如何使用Java库Proj4j实现WGS84与CGCS2000坐标系之间的高精度转换。通过七参数转换模型和格网改正量文件,提供完整的代码实现和项目配置指南,帮助开发者快速集成到地理信息系统项目中,提升坐标转换效率和精度。

weixin_29251567的博客 829

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

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

郑龙飞 1295

开源大模型“去审查化”技术解析:从LLaMA架构到本地部署与伦理边界

大型语言模型(LLM)基于Transformer架构,通过海量数据训练获得理解和生成自然语言的能力。其核心原理在于自注意力机制对上下文关系的建模。为了确保输出内容的安全与合规,主流模型普遍采用基于人类反馈的强化学习(RLHF)等技术进行安全对齐。这一过程旨在使模型行为符合人类价值观,是AI伦理工程实践的关键环节。然而,在特定研究场景下,如对抗性测试或内容安全算法研究,技术人员需要模拟极端对话以评估系统鲁棒性,这催生了针对“去对齐”或“移除护栏”的技术探索。此类技术通常通过对预训练模型进行反向微调或继续训练来

weixin_33743880的博客 592

HDMI采集芯片 ADV7611采集PC数据调试总结

开发环境:TI DM365 平台, ADV7611采集板, CCS5.5 第一步:I2C调通 这张是 ADV7611 读写的时序图,可以看出在写和读的时候发送地址数据的时候的停止位信息是不同的,在写的时候是不需要停止位的,但是读的时候是要停止位的。如果I2C在硬件没问题的时候可以考虑是不是这方面的问题。 第二步:map 配置: 根据官方推荐配置进行配置:   0x98,

带头奋青的博客 1万+

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

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

yu779的博客 2584

零基础也能搞定!华为USG6000V防火墙WEB管理界面开启教程

本文详细介绍了华为USG6000V防火墙WEB管理界面的开启教程,从环境准备、网络配置到防火墙初始化,逐步指导用户完成图形化管理界面的搭建。特别适合零基础用户快速掌握企业级防火墙的可视化操作,提升安全管理效率。

grape的博客 788

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

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

alex_goden的博客 5977

IKM 测试题 - Java SE 8 评估测试题目

IKM 测试题 - Java SE 8 评估测试题目

licheng11y的博客 1315

论文笔记:基于对比学习的半监督分类学习方法

论文阅读笔记_CCSSL

weixin_46224126的博客 3316

Spring Boot 中的虚拟线程

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

qq_36291550的博客 1697

让AI稳定生成流程图:基于Skill与Mermaid的工程化实践

流程图是软件工程中沟通业务逻辑的通用语言,但其绘制与维护却长期依赖手工工具,导致文档更新滞后、协作成本高。随着大语言模型技术的成熟,自然语言生成代码已成为可落地的技术路径,而Mermaid作为一款文本化图表语法,凭借其可版本管理、可自动渲染和可嵌入文档的优势,正逐步取代传统绘图工具。要让AI稳定输出合格的流程图,关键在于为模型定义一套清晰的Skill规则,约束输入结构、处理逻辑和输出格式。本文从流程图的工程痛点出发,介绍如何利用大模型将自然语言描述转化为结构化文本,再通过Mermaid CLI渲染成可视化图

weixin_42548782的博客 313

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

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

FastCompile的博客 902

基于MATLAB Simulink的电动汽车整车控制仿真

在本文中,我们选择了power_ElectricVehicle示例模型,该模型已经包含了电动汽车的基本组成部分,包括电机、变速器、驱动轮、电池等。例如,使用PID控制器来控制电机的转速,使用ABS控制器来控制车轮的制动力,使用转向控制器来控制车辆的转向角度,使用悬挂控制器来控制车轮的姿态等。通过建立模型和实现控制器,我们可以比较直观地了解电动汽车的工作原理和性能特点,并验证设计的控制系统在不同工况下的效果。而在电动汽车的开发中,整车控制系统是至关重要的一个组成部分,直接影响着电动汽车的性能和性价比。

qq_39605374的博客 1806

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

weixin_45483057的博客 2057

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【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、付费专栏及课程。

余额充值