作者:旷野说
定位: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 / WebFlux | Spring Web MVC + 虚拟线程 = 最佳性价比 |
🟢 结论:
对于 90% 的微服务(CRUD + 远程调用),Spring Boot + Web MVC + 虚拟线程 是最简单且高性能的选择。
🧵 终极口诀:Spring Boot 虚拟线程三三三
一栈三件:Boot、MVC、Tomcat;
虚拟三字:轻、挂、复;
用法三策:简、融、择。
详解:
-
一栈三件:
Spring Boot Web 应用 = Spring Boot(启动) + Spring Web MVC(路由/控制器) + 内嵌 Tomcat(网络层)。 -
虚拟三字:
- 轻:线程轻量;
- 挂:I/O 自动挂起;
- 复:OS 线程复用。
-
用法三策:
- 简:简单业务用同步代码 + 虚拟线程;
- 融:复杂场景融合 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 应用,既简洁,又飞快。 🚀

被折叠的 条评论
为什么被折叠?



