Skip to content

Spring WebFlux 是什么?它与 Spring MVC 有何不同? ​

  • 标签:后端、Spring

🏛 业务架构师 ​

Spring WebFlux 是 Spring 的响应式异步非阻塞 Web 框架:基于 Reactor(Mono/Flux)和 Netty 事件循环,用少量线程处理大量并发连接——线程不等 I/O,I/O 完成后回调继续处理。

与 Spring MVC 的核心区别:

  • 编程模型:MVC 命令式(一行一步);WebFlux 响应式(声明式数据流,调试和学习成本陡峭);
  • 线程模型:MVC 一请求一线程(虚拟线程时代成本大幅下降);WebFlux 固定少量 EventLoop 线程;
  • 生态约束:WebFlux 要全链路非阻塞才有意义——JDBC 这类阻塞驱动会把优势归零,必须 R2DBC/WebClient 陪跑。

业务架构师视角,我的选型判断非常务实:

  1. WebFlux 的适用面很窄:长连接/I/O 密集高并发网关类场景(Spring Cloud Gateway 就是 WebFlux 写的,这是它最成功的落地)、海量设备接入;普通业务系统(CRUD + 服务调用)用它,换来的是团队维护成本翻倍、堆栈排查困难——负收益;
  2. 2026 年的关键变量是虚拟线程:JDK 21+ 的虚拟线程让"同步写法获得异步吞吐"成为现实(spring.threads.virtual.enabled=true),WebFlux 的核心卖点被大幅稀释。我现在的默认选型是 Spring MVC + 虚拟线程,除非业务形态命中网关/流式场景;
  3. 决策框架就一条:先算并发量和团队成本,再谈编程范式——技术选型为业务和组织的总持有成本服务,不为简历服务。

🏗 系统架构师 ​

核心差异:线程与 IO 模型。

  • MVC:Servlet 阻塞模型,一请求一线程,受 Tomcat 线程池(默认 200)约束;
  • WebFlux:Reactive Streams 加 Netty 事件循环,少量线程(约等于 CPU 核数)处理海量并发连接,非阻塞调用链加背压传导——前提是全链路非阻塞(R2DBC、WebClient),一处阻塞(JDBC、同步锁)就毁掉整个模型。

我的选型判断(体现知识时效):

  1. 虚拟线程改变了天平:JDK 21 加 Boot 3.2 开启虚拟线程后,MVC 的阻塞代码直接获得百万级线程并发,开发与调试成本远低于 Reactive——IO 密集业务我选「MVC 加虚拟线程」而不是 WebFlux;
  2. WebFlux 的确定性场景:网关与聚合层(Spring Cloud Gateway 即 WebFlux 实现,少量线程扛海量连接转发)、全链路 R2DBC 的流式服务、SSE/流式推送;
  3. Reactive 的真实代价:调试栈噩梦、学习曲线、大量阻塞 SDK 不可用——没有压倒性理由不上。

💻 全栈开发专家 ​

Spring WebFlux 是 Spring 5 起的响应式非阻塞 Web 框架,基于 Reactor + 默认 Netty,对标基于 Servlet 阻塞模型的 Spring MVC。

核心差异:

  • 编程模型:MVC 命令式(一请求一线程);WebFlux 返回 Mono/Flux,少量事件循环线程服务大量并发
  • 容器:MVC 是 Servlet/Tomcat;WebFlux 默认 Netty
  • 吞吐:IO 密集、大量慢下游(网关、BFF、SSE 推送)场景优势明显;CPU 密集无优势
  • 调试:Reactor 栈深、排障成本高;MVC 栈直观
java
@GetMapping("/orders/{id}")
public Mono<OrderVO> order(@PathVariable Long id) {
    return orderRepository.findById(id)      // R2DBC 非阻塞
            .map(this::toVO)
            .timeout(Duration.ofSeconds(2));
}

我坚持的三条实战判断:

  1. 全链路非阻塞才有效:混一个阻塞 JDBC 调用,事件循环线程被卡住整个服务雪崩,必须 Schedulers.boundedElastic() 隔离或换 R2DBC
  2. 2026 年很多场景被虚拟线程替代:Boot 3.2+ 开 spring.threads.virtual.enabled=true,阻塞写法拿到接近的吞吐、复杂度低一个量级——新项目我默认"虚拟线程 MVC",只有网关类才考虑 WebFlux
  3. 团队 Reactor 素养是隐性成本,忘 subscribe、block 死锁这类坑很隐蔽