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

作者:旷野说
定位: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 应用,既简洁,又飞快。 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值