概述
Spring WebFlux 是 Spring 5 引入的响应式编程框架,与传统的 WebMVC 形成鲜明对比。本文通过组件架构、执行流程、代码示例等多维度对比两者的核心差异。
核心对比:
- 🏗️ 架构组件差异
- ⚡ 执行模型对比
- 💻 编程范式转变
- 🚀 性能特性分析
适用场景:
- WebMVC:传统同步阻塞应用
- WebFlux:高并发、IO密集型应用
WebMVC vs WebFlux 架构对比
组件架构

核心组件对比:
| 组件层 | WebMVC | WebFlux | 说明 |
|---|---|---|---|
| Web层 | Spring MVC | Spring WebFlux | Web框架 |
| 服务器 | Servlet容器(Tomcat等) | Netty/Undertow | 底层服务器 |
| API | Servlet API | Reactive Streams | 编程接口 |
| 线程模型 | 一请求一线程 | 事件循环 | 并发模型 |
执行流程
WebMVC 执行过程

特点:
1 | 请求 → DispatcherServlet → Handler Mapping → Controller |
执行特征:
- 🔒 同步阻塞:线程等待IO完成
- 🧵 一请求一线程:高并发时线程数激增
- ⏱️ 资源占用:等待期间线程被占用
WebFlux 执行过程

特点:
1 | 请求 → DispatcherHandler → Handler Mapping → Handler |
执行特征:
- ⚡ 异步非阻塞:线程立即返回
- 🔄 事件驱动:基于Reactive Streams
- 💪 高并发:少量线程处理大量请求
代码写法对比
场景:返回视图
WebMVC 写法

典型代码:
1 |
|
特点:
- ✅ 简单直观
- ✅ 同步代码易理解
- ❌ 阻塞线程
WebFlux 路由式写法

路由配置:
1 |
|
Handler实现:
1 |
|
WebFlux 注解式写法(兼容WebMVC):
1 |
|
写法对比:
| 特性 | WebMVC | WebFlux路由式 | WebFlux注解式 |
|---|---|---|---|
| 语法 | 简单 | 函数式 | 类似WebMVC |
| 灵活性 | 一般 | 高 | 一般 |
| 迁移成本 | - | 高 | 低 |
| 适用场景 | 传统应用 | 新项目 | 平滑迁移 |
编程思想对比
命令式编程(WebMVC)
定义:
1 | a = b + c |
含义: a 的值由 b 和 c 计算得出,后续 b、c 变化不影响 a
代码示例:
1 | // 辅助方法:模拟耗时操作 |
执行日志:

分析:
- ⏱️ "get1 start" 和 "get1 end" 相隔 5秒
- 🔒 线程在
createStr()执行期间被阻塞 - 📊 一个请求占用一个线程 5 秒
响应式编程(WebFlux)
定义:
1 | a := b + c |
含义: a 的值由 b 和 c 计算得出,后续 b、c 变化会影响 a(变化传递)
代码示例:
1 | // WebFlux 响应式写法 |
执行日志:

分析:
- ⚡ "get2 start" 和 "get2 end" 几乎同时
- 🚀 线程立即返回,不等待
createStr()完成 - ♻️
createStr()在订阅时异步执行
核心差异总结
性能对比
| 维度 | WebMVC | WebFlux |
|---|---|---|
| 线程模型 | 一请求一线程 | 事件循环(少量线程) |
| 并发能力 | 受线程数限制 | 可处理海量并发 |
| 资源消耗 | 高(线程切换开销) | 低(固定线程数) |
| 适用场景 | CPU密集型 | IO密集型 |
| 响应延迟 | 取决于业务逻辑 | 更低(非阻塞) |
实际效果
从调用者(浏览器)角度:
- ⏱️ 两者响应时间相同(都是5秒)
- 👀 用户体验无明显差异
从服务端角度:
1 | WebMVC: |
WebFlux 核心优势:
💡 能够以固定的线程数处理高并发,充分发挥机器性能。
优缺点对比
WebMVC:
| 优点 | 缺点 |
|---|---|
| ✅ 编程模型简单 | ❌ 高并发时线程数激增 |
| ✅ 调试容易 | ❌ 资源消耗大 |
| ✅ 生态成熟 | ❌ 阻塞等待浪费资源 |
| ✅ 学习成本低 | ❌ 扩展性受限 |
WebFlux:
| 优点 | 缺点 |
|---|---|
| ✅ 高并发处理能力强 | ❌ 学习曲线陡峭 |
| ✅ 资源利用率高 | ❌ 调试困难 |
| ✅ 适合IO密集型 | ❌ 生态不够成熟 |
| ✅ 固定线程数 | ❌ CPU密集型无优势 |
选择建议
使用 WebMVC 的场景
推荐使用:
- ✅ 传统CRUD应用
- ✅ 内部管理系统
- ✅ 并发量不高(< 1000 QPS)
- ✅ 团队不熟悉响应式编程
- ✅ CPU密集型计算
使用 WebFlux 的场景
推荐使用:
- ✅ 高并发API网关
- ✅ 实时数据流处理
- ✅ 微服务间通信
- ✅ IO密集型应用
- ✅ 需要背压控制的场景
迁移建议
平滑迁移路径:
1 | Step 1: 使用WebFlux注解式写法(兼容WebMVC) |
注意事项:
- ⚠️ 确保所有依赖都支持响应式
- ⚠️ 避免在WebFlux中使用阻塞操作
- ⚠️ 充分测试并发场景
- ⚠️ 团队需要响应式编程培训
最佳实践
WebFlux 开发建议
1. 避免阻塞操作
1 | // ❌ 错误:在WebFlux中使用阻塞操作 |
2. 使用响应式数据库
1 | // 推荐:R2DBC(响应式关系数据库) |
3. 错误处理
1 | public Mono<String> getData() { |
参考资源
学习资料:
相关技术:
- Reactive Streams
- Project Reactor
- RxJava
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 小五的个人杂货铺!