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

Linux匿名管道通信:原理深挖+代码实现,一篇吃透进程间数据流转

Linux匿名管道通信:原理深挖+代码实现,一篇吃透进程间数据流转

🔥个人主页:Cx330🌸 ❄️个人专栏:《C语言》《LeetCode刷题集》《数据结构-初阶》《C++知识分享》 《优选算法指南-必刷经典100题》《Linux操作系统》:从入门到入魔 《Git深度解析》:版本管理实战全解 🌟心向往之行必能至 🎥Cx330🌸的简介: 目录 前言: 一. 进程间通信介绍 1.1 进程间通信目的 1.2 进程间通信的发展与分类 二、先搞懂:什么是管道?匿名管道有何特殊性? 2.1 管道的本质 2.2 管道的核心特性 三、匿名管道的创建 3.1 匿名管道的创建流程 3.2 匿名管道的使用示例 四. 核心深挖:匿名管道的底层原理 4.1 fork

By Ne0inhk
Flutter 三方库 flutter_adaptive_scaffold 的鸿蒙化适配指南 - 掌握一套代码适配全场景终端的自适应架构技术、助力鸿蒙应用构建从手机到平板及折叠屏的极致无缝交互体系

Flutter 三方库 flutter_adaptive_scaffold 的鸿蒙化适配指南 - 掌握一套代码适配全场景终端的自适应架构技术、助力鸿蒙应用构建从手机到平板及折叠屏的极致无缝交互体系

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 flutter_adaptive_scaffold 的鸿蒙化适配指南 - 掌握一套代码适配全场景终端的自适应架构技术、助力鸿蒙应用构建从手机到平板及折叠屏的极致无缝交互体系 前言 在 OpenHarmony 鸿蒙应用追求“万物互联、全场景覆盖”的伟大进程中,屏幕尺寸的多样性(从 6 英寸手机到 12 英寸平板,再到 2D/3D 模式切换的折叠屏)是每一位 UI 开发者必须正面迎接的挑战。如何在不为每种设备重写 UI 的前提下,实现导航栏自动从“底部”平滑流转到“侧边”?如何在宽屏模式下自动开启“双栏(Master-Detail)”布局?flutter_adaptive_scaffold 作为一个由 Flutter

By Ne0inhk
Flutter 三方库 system_shortcuts 的鸿蒙化适配指南 - 实现快速触发系统级快捷功能、支持 WiFi 开关、亮度调节与系统设置一键直达

Flutter 三方库 system_shortcuts 的鸿蒙化适配指南 - 实现快速触发系统级快捷功能、支持 WiFi 开关、亮度调节与系统设置一键直达

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 system_shortcuts 的鸿蒙化适配指南 - 实现快速触发系统级快捷功能、支持 WiFi 开关、亮度调节与系统设置一键直达 前言 在进行 Flutter for OpenHarmony 的应用工具开发时,能够快速引导用户跳转到系统设置页面,或直接触发某些系统级快捷功能(如切换静音、调节亮度)是提升交互效率的关键。system_shortcuts 是一个封装了各平台快捷路径的库。本文将探讨如何在鸿蒙系统下利用该库构建极致便捷的系统级操作流。 一、原理解析 / 概念介绍 1.1 基础原理 system_shortcuts 核心是通过平台通道(MethodChannel)调用操作系统的 want(鸿蒙的启动意图)或特定的系统服务接口。它屏蔽了复杂的跳转 URI 拼接,提供了语义化的接口。 封装

By Ne0inhk
云开发 Copilot ——让开发变得更简单

云开发 Copilot ——让开发变得更简单

声明:本篇博客为云开发 Copilot体验文章,非广告 目录 前言: 游客体验 云开发 Copilot实战: 一、图片生成需求 二、云开发 Copilot实现需求 三、AI生成低代码页面 Copilot 的亮点功能 使用场景 云开发 Copilot开发的前景展望 前言: 在云开发AI+中,腾讯云提供一系列与 AI 相关的功能,如大模型接入、 Agent 等,帮助开发者为自己的小程序、web 或者应用快速接入 AI 能力,同时也提供了云开发 Copilot,来加速用户的开发,帮助用户更快构建自己的应用。下面博主将会为大家实战使用云开发 Copilot来助力开发。 云开发 Copilot是云开发推出的一款 AI 开发辅助工具,可以帮助用户快速生成多种类型的应用功能,包括低代码应用、页面、组件、数据模型、

By Ne0inhk