Spring Boot 项目中的响应式应用(Reactive Web)与传统 MVC:原理区别、代码对比与适用场景

Spring Boot 项目中的响应式应用(Reactive Web)与传统 MVC:原理区别、代码对比与适用场景

在 Spring Boot 项目中,开发者经常需要在传统 Spring MVC 和响应式 WebFlux 之间做出选择,尤其当配置文件中出现 spring.main.web-application-type: reactive 时。本文将从底层原理、线程模型、I/O 处理方式、适用场景等角度详细对比两者,并通过实际代码示例说明差异。

1. 核心原理对比

维度传统 Spring MVC (Servlet-based)Spring WebFlux (Reactive / Non-blocking)
编程范式命令式(Imperative)声明式 + 响应式(Declarative + Reactive)
底层 I/O 模型阻塞 I/O(Blocking I/O)非阻塞 I/O(Non-blocking I/O)
线程模型线程-per-请求(每个请求独占一个线程)事件循环 + Reactor 线程池(少量线程处理大量连接)
请求处理流程请求 → 线程池分配线程 → 阻塞等待 I/O → 返回响应请求 → 事件循环注册回调 → 非阻塞等待 → 回调执行
并发瓶颈线程数上限(默认 200)→ 高并发时线程耗尽、上下文切换严重线程数极少(默认 CPU 核数 × 2)→ 并发能力极高
资源利用率线程阻塞时 CPU 空闲,资源浪费严重线程不阻塞,CPU 利用率高,内存占用低
背压(Backpressure)无原生支持,高负载时容易雪崩原生支持(Publisher 控制生产速度,避免下游崩溃)
事件驱动来源Servlet 容器事件(Tomcat/Jetty)Netty 事件循环 + Reactor 的 Scheduler
异常处理同步抛出异常,线程栈可追踪异步异常通过 Mono/Flux 传播,栈追踪较复杂

传统 MVC(Servlet)原理简述

  1. 客户端请求到达 Tomcat/Jetty
  2. Servlet 容器从线程池取一个线程处理该请求
  3. 线程执行 Controller 方法
  4. 如果遇到数据库、网络 I/O,线程会阻塞等待(挂起)
  5. I/O 完成后继续执行,响应返回,线程归还线程池
  6. 高并发时线程池耗尽 → 请求排队 → 超时或拒绝

WebFlux(Reactive)原理简述

  1. 客户端请求到达 Netty
  2. Netty 事件循环线程(Event Loop)接受连接,不分配新线程
  3. 请求被包装成 Mono/Flux(Publisher)
  4. I/O 操作注册为异步回调(非阻塞)
  5. 当前线程立即返回,继续处理其他事件
  6. I/O 完成时,回调被调度到 Reactor 线程池执行
  7. 整个过程线程不阻塞,可处理成千上万并发连接

核心区别一句话:
MVC 是“一个请求一个线程,线程等 I/O”;WebFlux 是“少量线程等事件,事件来了再处理”

2. 日常项目中的真实例子

例子 1:普通后台管理系统(推荐传统 MVC)

场景:公司内部 OA 系统,有员工管理、请假审批、报销申请等功能。
并发不高(日活几百人),主要瓶颈是数据库查询。

选择:默认 MVC + Tomcat

原因:

  • 业务逻辑以同步数据库操作为主
  • 团队熟悉 Servlet 和传统 Controller 写法
  • 并发压力小,200 个线程完全够用
  • 使用 POI、JWT 等阻塞式库时无需额外适配

代码示例(MVC):

@GetMapping("/employees")publicList<Employee>listEmployees(){return employeeService.list();// 同步查询,线程阻塞等待}

例子 2:实时消息推送服务(推荐 WebFlux)

场景:一个直播平台的弹幕系统,每秒有数千条弹幕需要推送给数万在线用户。
需要支持 WebSocket 长连接 + SSE 实时流。

选择:WebFlux + Netty

原因:

  • 极高并发长连接(几万 WebSocket)
  • 传统线程模型下线程耗尽可能导致服务崩溃
  • WebFlux 少线程模型 + 非阻塞 I/O 轻松支撑

代码示例(WebFlux):

@GetMapping(value ="/barrage/stream", produces =MediaType.TEXT_EVENT_STREAM_VALUE)publicFlux<String>streamBarrage(){return barrageService.getBarrageFlux().map(msg ->"data: "+ msg +"\n\n");// 非阻塞流式推送}

例子 3:API 网关层(强制 WebFlux)

场景:Spring Cloud Gateway 作为统一入口,需要处理路由、限流、鉴权、熔断、跨服务转发。

选择:必须 WebFlux

原因:

  • 网关是 I/O 密集型,请求转发量巨大
  • 传统 MVC 在网关场景下容易出现线程耗尽
  • Gateway 官方就是基于 WebFlux 开发

配置示例:

spring:main:web-application-type: reactive cloud:gateway:routes:-id: user-route uri: lb://user-service predicates:- Path=/user/**

3. 如何在项目中选择与配置

强制使用响应式栈

spring:main:web-application-type: reactive 

依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>

同时引入 web 和 webflux 时

默认走 MVC。想强制 WebFlux 必须设置 reactive 或移除 spring-boot-starter-web

总结

  • 传统 MVC:线程-per-请求、阻塞 I/O、适合大多数 CRUD 业务、生态最成熟。
  • 响应式 WebFlux:事件循环、非阻塞 I/O、少线程高并发、适合网关、实时推送、高吞吐场景。
  • 日常 80% 项目:用 MVC 就够了,开发快、坑少。
  • 高并发 I/O 密集型:切换 WebFlux,能显著提升吞吐量和资源利用率。

选择合适的 Web 栈,能让项目在性能与开发效率之间取得最佳平衡。

Read more

Flutter 组件 whitecodel_auto_link 适配鸿蒙 HarmonyOS 实战:交互式文本探针,构建信息流自动链接识别与极速预览架构

Flutter 组件 whitecodel_auto_link 适配鸿蒙 HarmonyOS 实战:交互式文本探针,构建信息流自动链接识别与极速预览架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 whitecodel_auto_link 适配鸿蒙 HarmonyOS 实战:交互式文本探针,构建信息流自动链接识别与极速预览架构 前言 在鸿蒙(OpenHarmony)生态迈向深度社交、企业办公及即时通讯全场景覆盖的背景下,如何将枯燥的长文本转化为具备可交互能力的“信息枢纽”,已成为提升用户操作效率的关键。在鸿蒙设备这类强调分布式协同与智慧感知的移动终端上,如果应用仅能显示纯文本,而无法识别其中的网址(URL)、邮箱(Email)或电话(Phone),用户就必须通过复杂的“长按、复制、切换应用、粘贴”链路来处理信息,这极大地割裂了鸿蒙系统的流转体验。 我们需要一种能够自动扫描文本特征、支持多维热点识别且具备高性能渲染能力的富文本处理引擎。 whitecodel_auto_link 为 Flutter 开发者引入了极其简便的长文本自动链接方案。它通过内置的高精度正则匹配矩阵,自动将文本中的特定识别域转化为可点击的高亮区域。在适配到鸿蒙

By Ne0inhk
Spring Boot 后端分层开发实战:从 MVC 到三层架构详解

Spring Boot 后端分层开发实战:从 MVC 到三层架构详解

应用分层 通过上面的练习,我们学习了 Spring MVC 简单功能的开发,但是我们也发现了一些问题。目前我们程序的代码有点 “杂乱”,然而当前只是 “一点点功能” 的开发。如果我们把整个项目功能完成呢?代码会更加的 “杂乱无章”(文件乱,代码内容乱)。 也基于此,咱们接下来学习应用分层。类似公司的组织架构:公司初创阶段,一个人身兼数职,既做财务,又做人事,还有行政。随着公司的逐渐壮大,会把岗位进行细分,划分为财务部门,人事部门,行政部门等。各个部门内部还会再进行细分。 项目开发也是类似,最开始功能简单时,我们前后端放在一起开发,随着项目功能的复杂,我们分为前端和后端不同的团队,甚至更细粒度的团队。后端开发也会根据功能再进行细分。MVC 就是其中的一种拆分方式。但是随着后端人员不再涉及前端,后端开发又有了新的分层方式。 4.1 介绍 阿里开发手册中,关于工程结构部分,定义了常见工程的应用分层结构: 那么什么是应用分层呢?应用分层是一种软件开发设计思想,

By Ne0inhk

大模型实习模拟面试面经:同花顺金融大模型算法一面深度复盘(RAG、LoRA、强化学习、Agent 架构全解析)

大模型实习模拟面试面经:同花顺金融大模型算法一面深度复盘(RAG、LoRA、强化学习、Agent 架构全解析) 关键词:大模型面试|RAG 重排序|LoRA 参数优化|GRPO 训练异常处理|Agentic RL|金融 Agent 开发|AI for SE 前言:为什么这场面试值得复盘? 2026 年,大模型技术已从“学术热点”全面转向“工业落地”,尤其在金融、医疗、法律等高价值垂直领域,智能 Agent 正成为企业核心竞争力的关键载体。作为国内领先的金融科技公司,同花顺近年来大力投入金融大模型与智能投研 Agent 的研发,其算法岗面试自然聚焦于工程实现能力 + 领域理解深度 + 技术前沿敏感度三大维度。 本文基于真实模拟面试场景,完整还原一场面向大模型算法实习生岗位的一轮技术面全过程。面试官围绕 RAG 重排序机制、LoRA

By Ne0inhk
Spring Cloud 熔断降级详解:用 “保险丝“ 类比,Sentinel 实战教程

Spring Cloud 熔断降级详解:用 “保险丝“ 类比,Sentinel 实战教程

欢迎文末添加好友交流,共同进步! “ 俺はモンキー・D・ルフィ。海贼王になる男だ!” * 📋 目录 * 什么是熔断降级 * 定义 * 为什么需要熔断降级? * 保险丝类比:形象理解熔断机制 * 生活中的保险丝 * 熔断器工作原理对比 * 熔断器三种状态 * Sentinel 核心概念 * 什么是 Sentinel? * 核心概念对比 * Sentinel vs Hystrix 对比 * Sentinel 实战教程 * 环境准备 * 1. 添加依赖 * 2. 配置文件 * 基础示例:注解方式 * 3. 主启动类 * 4. 创建订单服务 * 5. 控制器 * 高级配置:规则定义 * 6. 流控规则配置 * OpenFeign 集成 * 7. Feign客户端集成Sentinel * 8. Feign降级处理 * 规则持久化(

By Ne0inhk