当前位置: 首页 > news >正文

重学SpringBoot3-Spring WebFlux简介

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-Spring WebFlux简介

  • 1. 什么是 WebFlux?
  • 2. WebFlux 与 Spring MVC 的区别
  • 3. WebFlux 的用处
    • 3.1 非阻塞 I/O 操作
    • 3.2 响应式编程模型
    • 3.3 更高的性能和可扩展性
    • 3.4 支持多种 Web 容器
  • 4. WebFlux 的应用场景
    • 4.1 高并发 Web 应用
    • 4.2 微服务架构中的异步服务
    • 4.3 实时数据流应用
  • 5. 如何在 Spring Boot 3 中使用 WebFlux
  • 6. 总结

随着微服务架构的流行和对高并发、低延迟系统需求的增加,响应式编程逐渐成为现代应用开发的主流方式之一。Spring Boot 3 引入了对响应式编程的强大支持,其中 Spring WebFlux 是一个重要的模块。本文将介绍 Spring WebFlux 的概念、特点以及它在实际应用中的场景和优势。

1. 什么是 WebFlux?

Spring WebFlux 是 Spring Framework 5 中引入的一个响应式 Web 框架,它是为了支持非阻塞异步通信和响应式流处理而设计的。与传统的基于 Servlet 的 Spring MVC 模型不同,WebFlux 基于Reactive Streams 规范,提供了一种完全异步和非阻塞的编程模型。

WebFlux 核心基于 Reactor 项目,使用 MonoFlux 这两个主要的反应式抽象来处理单值和多值的流。

2. WebFlux 与 Spring MVC 的区别

Spring MVC 是基于 Servlet 规范的,它使用同步阻塞式的 I/O 模型,适合传统的 Web 应用程序。每个请求对应一个线程,在处理请求的过程中,线程可能会因为 I/O 操作(例如数据库查询或远程调用)而处于阻塞状态。

而 WebFlux 则是完全异步的,它使用了 Netty 或 Undertow 这样的非阻塞服务器。WebFlux 应用的每个请求并不占用线程去等待 I/O 结果,而是基于事件驱动模型,当有数据准备好时才进行处理,这极大地提高了并发处理的能力和资源利用率。

API功能Servlet-阻塞式WebWebFlux-响应式Web
前端控制器DispatcherServletDispatcherHandler
处理器ControllerWebHandler/Controller
请求、响应ServletRequest、ServletResponseServerWebExchange:ServerHttpRequest、ServerHttpResponse
过滤器Filter(HttpFilter)WebFilter
异常处理器HandlerExceptionResolverDispatchExceptionHandler
Web配置@EnableWebMvc@EnableWebFlux
自定义配置WebMvcConfigurerWebFluxConfigurer
返回结果任意Mono、Flux、任意
发送REST请求RestTemplateWebClient

WebFlux与Spring MVC的区别

3. WebFlux 的用处

3.1 非阻塞 I/O 操作

WebFlux 最显著的特点是其非阻塞 I/O 操作。在处理高并发场景时,WebFlux 能够避免因大量线程阻塞等待 I/O 而带来的性能开销。非阻塞模型可以使应用在处理大量请求时具备更高的可伸缩性。

例如,在微服务架构中,服务之间经常需要通过 RESTful API 进行通信。使用 WebFlux 可以构建高效的非阻塞服务,这些服务可以同时处理大量请求,而不会因为等待外部系统的响应而消耗大量资源。

3.2 响应式编程模型

WebFlux 基于响应式编程,提供了一个更适合流式数据处理的编程范式。它使用 FluxMono 作为核心抽象:

  • Mono:表示 0 或 1 个元素的异步序列。
  • Flux:表示 0 到 N 个元素的异步序列。

通过这些抽象,开发者可以方便地处理数据流、组合异步操作,并且能够轻松处理如 backpressure(背压)等复杂的场景。

3.3 更高的性能和可扩展性

由于 WebFlux 是异步非阻塞的,它能够更有效地利用 CPU 和内存资源,特别是在处理高并发请求时。与传统的同步阻塞模型相比,WebFlux 应用通常能更好地处理大量并发请求,而不会遇到线程耗尽的问题。

3.4 支持多种 Web 容器

WebFlux 不是基于传统的 Servlet 容器,而是支持 Netty 和 Undertow 等非阻塞服务器。此外,它也可以运行在支持 Servlet 3.1+ 规范的容器(如 Tomcat 和 Jetty)中,但在这种情况下,WebFlux 会以异步非阻塞的方式运行。

4. WebFlux 的应用场景

WebFlux 非常适合以下场景:

4.1 高并发 Web 应用

对于需要处理大量并发请求的 Web 应用,WebFlux 提供了良好的解决方案。它的非阻塞特性允许应用更好地扩展,并在高负载下表现出色。

4.2 微服务架构中的异步服务

在微服务架构中,各个服务之间经常需要进行远程调用,这些调用可能涉及 I/O 操作,例如与数据库的交互或调用其他服务的 API。WebFlux 允许你以响应式的方式实现这些异步操作,从而提高服务之间通信的效率。

4.3 实时数据流应用

如果你的应用需要处理实时数据流(如消息处理、WebSocket 通信等),WebFlux 的响应式编程模型可以让你轻松构建复杂的流式数据处理逻辑,并且具备良好的性能和可维护性。

5. 如何在 Spring Boot 3 中使用 WebFlux

在 Spring Boot 3 中启用 WebFlux 非常简单。你只需要添加相关依赖即可:

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

接着,你可以定义控制器和服务层来使用 MonoFlux 处理请求。以下是一个简单的 WebFlux 控制器示例:

package com.coderjia.boot3webflux.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;/*** @author CoderJia* @create 2024/10/19 下午 08:05* @Description**/
@RestController
@RequestMapping("/api")
public class WebFluxController {@GetMapping("/mono")public Mono<String> getMono() {return Mono.just("Hello, Mono!");}@GetMapping("/flux")public Flux<String> getFlux() {return Flux.just("Hello", "World", "From", "WebFlux", "Controller", "in", "Spring Boot 3!");}
}

在这个示例中,/mono 返回一个 Mono 对象,表示异步地返回一个字符串,

mono举例

/flux 返回一个 Flux 对象,表示一系列的字符串数据流。通过这种方式,你可以使用 WebFlux 构建异步非阻塞的 Web API。

flux举例

6. 总结

Spring WebFlux 是一种基于响应式编程的非阻塞 Web 框架,它为构建高性能、高并发的现代 Web 应用提供了强大的支持。通过使用 WebFlux,开发者可以充分利用异步 I/O 和响应式流处理的优势,构建具有良好可扩展性和性能表现的应用。

WebFlux 在高并发、微服务架构和流式数据处理等场景中表现出色。如果你的应用需要处理大量并发请求或实时数据流,WebFlux 是一个值得考虑的技术选择。后面文章会继续介绍 WebFlux 相关应用。

相关文章:

重学SpringBoot3-Spring WebFlux简介

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-Spring WebFlux简介 1. 什么是 WebFlux&#xff1f;2. WebFlux 与 Spring MVC 的区别3. WebFlux 的用处3.1 非阻塞 I/O 操作3.2 响应式编程模型3.3 更高…...

distinct 和 group by

最近生产加了一个新字段 a、然后将主键赋值给 a 然后投产后验证是否有漏网之鱼。当时使用的是 select count(distinct pk),count(distinct a) from tableName当时在想这样子跟 group by 有啥区别 select a from tableName group by a having count(a) > 1所以查一下两者…...

RTThread-Nano学习一-基于MDK移植

一、简介 关于RTThread-nano的介绍&#xff0c;这里不做过多解释&#xff0c;官方文档已经介绍的非常详细了&#xff0c;有兴趣的可以参考如下文档&#xff1a;RT-Thread 文档中心 二、移植 1.准备一个能正常运行的代码 手头有M0内核的板子&#xff0c;那就以…...

Vue中v-bind对样式控制的增强—(详解v-bind操作class以及操作style属性,附有案例+代码)

文章目录 v-bind对样式控制的增强2.1 操作class2.1.1 语法2.1.2 对象语法2.1.3 数组语法2.1.4 使用2.1.5 Test 2.2 操作style2.2.1 语法2.2.2 使用2.2.3 Test v-bind对样式控制的增强 2.1 操作class 2.1.1 语法 <div> :class "对象/数组">这是一个div&l…...

【分布式微服务云原生】《ZooKeeper 深度探秘:分布式协调的强大利器》

**《ZooKeeper 深度探秘&#xff1a;分布式协调的强大利器》 ** 摘要&#xff1a;本文将深入详解 ZooKeeper&#xff0c;涵盖其工作原理、实现分布式锁的方法、应用场景、负载均衡的实现以及不同角色的作用等内容。读者将全面了解 ZooKeeper 的强大功能和价值&#xff0c;为构…...

打造高性能在线电子表格:WebGL 渲染引擎 Kola2d 自研之路

导读&#xff1a;本文主要阐述了 Docs 在线表格为打造极致渲染性能所做的关键优化和过程思考&#xff0c;作为首个在在线电子表格领域自研基于WebGL渲染引擎的「吃螃蟹」者&#xff0c;整个过程面临诸多不确定性与挑战&#xff0c;Kola2d 的整体设计在此期间也经历了几轮推倒重…...

深入理解WPF中的命令机制

Windows Presentation Foundation&#xff08;WPF&#xff09;是微软推出的一种用于构建桌面客户端应用程序的技术。它被认为是现代Windows应用程序的基础&#xff0c;具有强大的图形和媒体处理能力。在WPF中&#xff0c;“命令”是一个重要的概念&#xff0c;它为应用程序开发…...

基础算法(6)——模拟

1. 替换所有的问号 题目描述&#xff1a; 算法思路&#xff1a; 从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;尝试用 a ~ z 的每一个字符替换即可 注意点&#xff1a;需考虑数组开头和结尾是问号的边界情况 代码实现&#xff1a; class Solution {public …...

2025年广西高考报名流程图解(手机端)

广西 2025 年高考报名时间已经确定啦&#xff0c;从 2024 年 10 月 21 日开始&#xff0c;到 10 月 31 日 17:30 结束 &#x1f4bb;【报名路径】 有电脑端和手机端两种选择哦。 电脑端&#xff1a;登录 “广西招生考试院” 网站&#xff08;https://www.gxeea.cn&#xff0…...

十、结构型(外观模式)

外观模式&#xff08;Facade Pattern&#xff09; 概念 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;旨在为复杂子系统提供一个简化的统一接口。通过外观模式&#xff0c;客户端可以与子系统交互&#xff0c;而无需了解子系统的内部复杂性…...

10.12Python数学基础-矩阵(上)

矩阵 1.矩阵定义 1.1 矩阵的定义 矩阵是由一组数按照矩形排列而成的数表。矩阵通常用大写字母表示&#xff0c;例如 AA、BB 等。矩阵中的每个数称为矩阵的元素或元。 一个 mn的矩阵 AA 可以表示为&#xff1a; A ( a 1 n a 12 … a 1 n a 21 a 22 … a 2 n ⋮ a m 1 a m 2…...

重学SpringBoot3-安装Spring Boot CLI

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-安装Spring Boot CLI 1. 什么是 Spring Boot CLI&#xff1f;2. Spring Boot CLI 的安装2.1. 通过 SDKMAN! 安装2.2. 通过 Homebrew 安装&#xff08;适…...

代码复现(五):GCPANet

文章目录 net.py1.class Bottleneck&#xff1a;残差块2.class ResNet&#xff1a;特征提取3.class SRM&#xff1a;SR模块4.class FAM&#xff1a;FIA模块5.class CA&#xff1a;GCF模块6.class SA&#xff1a;HA模块7.class GCPANet&#xff1a;网络架构 train.pytest.py 论文…...

联邦学习实验复现—MNISIT IID实验 pytorch

联邦学习论文复现&#x1f680; 在精度的联邦学习的论文之后打算进一步开展写一个联邦学习的基础代码&#xff0c;用于开展之后的相关研究&#xff0c;首先就是复现一下论文中最基础也是最经典的MNIST IID(独立同分布划分) 数据集。然后由于这个联邦学习的论文是谷歌发的&#…...

2015年-2017年 计算机技术专业 程序设计题(算法题)实战_c语言程序设计数据结构程序设计分析

文章目录 20151.C语言算法设计部分2.数据结构算法设计部分 20161.C语言算法设计部分2.数据结构算法设计部分 2017年1. C语言算法设计部分2.数据结构算法设计部分 2015 1.C语言算法设计部分 int total(int n) {if(n1) return 1;return total(n-1)n1; } //主函数测试代码已省略…...

个人用计算理论导引笔记(待补充)

文章目录 一、正则语言预备知识确定性有穷自动机&#xff08;DFA&#xff09;设计DFA正则运算 非确定性有穷自动机&#xff08;NFA&#xff0c;含有 ε \varepsilon ε&#xff0c;下一个状态可以有若干种选择&#xff08;包括0种&#xff09;&#xff09;正则表达式定义计算优…...

2024年诺贝尔物理学奖揭晓:AI背后的“造梦者”是谁?

想象一下&#xff0c;你早上醒来&#xff0c;智能音箱为你播放天气和新闻&#xff0c;中午你用手机刷视频&#xff0c;精准的推荐内容简直和你心有灵犀&#xff0c;晚上回家&#xff0c;自动驾驶汽车安全地把你送回家。这一切看似理所当然&#xff0c;背后却有一双无形的手推动…...

2024年AI 制作PPT新宠儿,3款神器集锦,让你的演示与众不同

咱们今儿聊聊最近超火的AI做PPT的工具。这年头&#xff0c;谁不想省事儿&#xff0c;少熬夜加班&#xff0c;多享受享受生活啊&#xff1f;所以&#xff0c;AI开始帮咱们搞定做PPT这种费时的活儿&#xff0c;我自然得好好研究研究。今天&#xff0c;我就给大家详细说说三款很火…...

CLion和Qt 联合开发环境配置教程(Windows和Linux版)

需要安装的工具CLion 和Qt CLion下载链接 :https://www.jetbrains.com.cn/clion/ 这个软件属于直接默认安装就行&#xff0c;很简单&#xff0c;不多做介绍了 Qt:https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/ window 直接点exe Linux 先c…...

Qt记录使用QtAwesome

Qt记录使用QtAwesome 基本使用 基本使用 pro文件添加 CONFIG fontAwesomeFree include(QtAwesome/QtAwesome.pri) //实例化QtAwesome fa::QtAwesome* awesome new fa::QtAwesome(this); awesome->initFontAwesome();//设置外置适应 图标ICON的颜色color QVariantMap opt…...

Filament Shield 核心功能深度解析:资源、页面和小部件权限管理

Filament Shield 核心功能深度解析&#xff1a;资源、页面和小部件权限管理 【免费下载链接】filament-shield The easiest and most intuitive way to add access management to your Filament Panel; Resources, Pages & Widgets through spatie/laravel-permission 项…...

Reloaded-II模组依赖无限下载循环终极解决方案:全流程故障诊断与修复指南

Reloaded-II模组依赖无限下载循环终极解决方案&#xff1a;全流程故障诊断与修复指南 【免费下载链接】Reloaded-II Universal .NET Core Powered Modding Framework for any Native Game X86, X64. 项目地址: https://gitcode.com/gh_mirrors/re/Reloaded-II 问题定位&…...

Phi-3-Mini-128K实战落地:政务公文智能校对+政策条款关联推荐引擎

Phi-3-Mini-128K实战落地&#xff1a;政务公文智能校对政策条款关联推荐引擎 1. 引言&#xff1a;当轻量化大模型遇上严肃政务场景 想象一下&#xff0c;一位政府部门的文秘人员正在起草一份重要的政策文件。他需要确保公文格式绝对规范、用词严谨准确&#xff0c;同时还要从…...

FastAPI Depends的隐藏玩法:从数据库事务到请求限流,5个提升API健壮性的实战技巧

FastAPI Depends的隐藏玩法&#xff1a;从数据库事务到请求限流&#xff0c;5个提升API健壮性的实战技巧 在FastAPI的日常开发中&#xff0c;大多数开发者对Depends的理解停留在基础依赖注入层面——获取数据库连接、验证用户权限或是解析查询参数。但当我们深入探索这个看似简…...

Windows下TensorFlow CPU加速终极方案:AVX2指令集优化版安装指南

Windows平台TensorFlow CPU性能飞跃&#xff1a;AVX2指令集优化实战手册 当你在PyCharm中运行TensorFlow代码时&#xff0c;是否见过这样的警告&#xff1a;"Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2"&#xff1f…...

别再只盯着YOLO了!用ByteTrack在Python里实现一个简易的车辆跟踪器(附完整代码)

用PythonByteTrack打造高精度车辆追踪系统&#xff1a;从原理到实战 在智能交通和视频监控领域&#xff0c;目标追踪技术正发挥着越来越重要的作用。当我们需要分析交通流量、统计车辆类型或监测异常行为时&#xff0c;仅仅依靠目标检测是远远不够的——我们还需要知道同一个目…...

OpenGL插值曲线实战:从二次到四次的参数化绘制与矩阵求解

1. 为什么我们需要插值曲线&#xff1f; 在图形学和动画制作中&#xff0c;我们经常需要创建平滑的过渡效果。想象一下你在设计一个游戏角色移动的轨迹&#xff0c;或者制作一个UI元素的动画效果&#xff0c;直接使用折线会显得非常生硬。这时候插值曲线就派上用场了。 插值曲线…...

反激电源设计(9)——补偿器参数优化实战

1. 从理论到实战&#xff1a;为什么补偿器参数优化如此重要&#xff1f; 做过反激电源设计的朋友都知道&#xff0c;补偿器就像是电源系统的"大脑"&#xff0c;它决定了整个电源的稳定性和动态响应。但很多工程师在设计时都会遇到这样的困境&#xff1a;明明按照理论…...

快速上手:CYBER-VISION零号协议Node.js后端服务集成指南

快速上手&#xff1a;CYBER-VISION零号协议Node.js后端服务集成指南 你是不是已经部署好了CYBER-VISION零号协议模型&#xff0c;看着那个命令行界面&#xff0c;心里琢磨着&#xff1a;“这玩意儿怎么才能接到我的Web应用里去&#xff1f;” 别急&#xff0c;这正是我们今天要…...

MacOS下Homebrew国内源配置全攻略:阿里、清华、中科大镜像一键切换

1. 为什么需要切换Homebrew国内镜像源&#xff1f; 如果你经常在MacOS上使用Homebrew安装软件&#xff0c;大概率遇到过下载速度慢到让人抓狂的情况。我刚开始用brew安装Python时&#xff0c;眼睁睁看着进度条像蜗牛爬行&#xff0c;一个200MB的包下了半小时还没完。后来才发现…...