50、Spring WebFlux 的 自动配置 的一些介绍,与 Spring MVC 的一些对比
Spring WebFlux
Spring WebFlux 简称 WebFlux ,是 spring5.0 新引入的一个框架。
SpringBoot 同样为 WebFlux 提供了自动配置。
Spring WebFlux 和 Spring MVC 是属于竞争关系,都是框架。在一个项目中两个也可以同时存在。
SpringMVC 是基于 Servlet API 的, 是属于同步的框架,就是有请求过来,SpringMVC 去获取请求数据的时候,如果这条数据没有读取到,那么这条读取数据的线程就一直被阻塞的,意味着得专门有一条线程来处理每个请求,就是客户端每发来一个请求,服务器这边就得分配一条线程去处理请求。因此在高并发的时候,SpringMVC是会存在一些限制的。
WebFlux 是基于反应式的 API ,脱离了 Servlet API ,反应式的 API 是一个异步的,不需要为每个请求生成单独的线程去处理。
Spring WebFlux 是集成了 Reactor框架 / 基于Reactor框架
Spring WebFlux和Reactor底层默认使用 Netty 作为Web服务器
★ Reactor框架(反应式框架)
Reactor框架采用Mono和Flux两个类代表消息发布者,因此它们都实现了CorePublisher<T>接口,它们的区别在于:- Mono代表0~1个非阻塞数据;而Flux则代表0~N数据个非阻塞序列。
- Mono相当于只是一个Optional值;而Flux才是Stream。基本原理,其实就是基于 消息发布 - 消息订阅 的异步通信方式。
★ Spring WebFlux
Spring WebFlux就是基于Reactor实现的,其中Flux名称就是来自Reactor中的Flux类,WebFlux包括了
对反应式HTTP、服务器推送事件(SSE:Server Send Event)及WebSocket的支持。Spring WebFlux提供了两种开发方式:
- 使用类似Spring MVC的注解方式。在这种方式下,依然使用@Controller、@RequestMapping等注解修饰类、方法即可。
- 使用函数式编程模型的方式。在这种方式下,程序使用RouterFunction来注册映射地址和处理器方法之间路由关系。上面这两种编程模型只是形式上有所不同(代码编写方式上存在不同),它们本质上完全是一样的,它们都运行在相同的反应式流的基础之上。
★ Spring MVC VS Spring WebFlux
================================Spring MVC ================================--- Spring MVC 基于传统Servlet,服务器需要使用很大的线程池才能支持大量的并发请求;HttpServletRequest来获取请求参数:getParameter(),它是一个典型的同步方法,该方法的返回值是String类型。
——这意味着在没有获取请求参数之前,该方法就会阻塞线程,这就是同步。HttpServletResponse来生成响应,它也是同步:服务器生成的响应完全发送给客户端之前,该线程什么也做不了。这种同步的设计意味着,每当一个客户端请求到来时,必须启动单独的线程来为该请求提供服务。当请求的并发数量非常大时,只能通过水平的集群扩展、增加更多集群节点来处理这些并发请求。================================Spring WebFlux=============================--- Spring WebFlux采用异步、非阻塞的编程模型,底层反应式容器无需启动额外的线程。ServerRequest来获取请求参数,
比如 bodyToFlux(Class<? extends T> elementClass)、bodyToMono(Class<? extends T> elementClass)、formData()
这些的返回值都是 Flux 或 Mono 而 Flux 和 Mono 都并不是最终的数据 ,因此无需同步、阻塞等待数据的到来,Mono和Flux都是CorePublisher因此它们可以说只是消息发布者(或者说是一个消息通道,可以不管获取的消息是否有数据),而尝试获取消息的程序就是消息订阅者。这意味着程序在获取Flux或Mono之后,完全可以继续向下执行,无需阻塞线程。Spring WebFlux的最大优势在于:能以较小的、固定数量的线程和更少的内存处理更多的并发请求,因此Spring WebFlux可以在高负载的情况具有更好的可伸缩性——因为无需显著增加线程和内存。Spring MVC适用于同步处理的场景,Spring WebFlux适用于异步处理的场景,尤其在大量IO密集型(比如Spring Cloud网关)的服务中使用Spring WebFlux比较适合。
★ Spring WebFlux的自动配置
Spring WebFlux的自动配置主要由WebFluxAutoConfiguration自动配置类负责提供支持。自动配置在Spring WebFlux默认功能的基础上添加了如下特性:- 为HttpMessageReader和HttpMessageWriter实例配置了codecs。
- 对服务器静态资源提供支持,包括对WebJars的支持。
★ 对WebFlux自动配置进行定制
若要在保留自动配置的基础上增加一些自定义的Spring WebFlux配置(例如添加拦截器、格式化器、视图控制器等),则可通过实现自己的WebFluxConfigurer类,并使用@Configuration注解修饰该类、但不要使用@EnableWebFlux注解修饰。实现该类的如下方法:- addFormatters(FormatterRegistry registry):添加格式化器
- configureArgumentResolvers(ArgumentResolverConfigurer configurer):配置参数解析器
- configurePathMatching(PathMatchConfigurer configurer):配置路径匹配器
- configureViewResolvers(ViewResolverRegistry registry):配置视图解析器
...
★ 全面接管
如果使用@Configuration和@EnableWebFlux注解同时修饰自己的Spring WebFlux配置类。这意味着完全关闭了Spring WebFlux的自动配置,开发者必须手动完成所有关于Spring WebFlux的配置工作。
★ 静态资源处理
(完全类似于Spring Boot对Spring MVC所提供的静态资源处理)
与Spring MVC类似,Spring Boot同样使用类加载路径下/static目录(或/public或/resources或/META-INF/resources)
或应用根路径作为WebFlux的静态资源路径。 如需添加静态资源路径,可提供WebFluxConfigurer实现类,通过实现addResourceHandlers()方法可添加自定义的静态资源目录如果要更改,覆盖原来的静态资源目录,可通过spring.web.resources.static-locations来覆盖系统原有的静态资源目录。同样支持版本无关的静态资源和静态资源缓存清除
★ 图标和首页
(完全类似于Spring Boot对Spring MVC的首页和图标支持)
与Spring MVC类似,Spring WebFlux同样可使用静态资源路径下的index.html或templates路径下index模板作为应用的首页。Spring WebFlux同样会使用静态资源路径下的favicon.ico文件作为应用的图标。
相关文章:
50、Spring WebFlux 的 自动配置 的一些介绍,与 Spring MVC 的一些对比
Spring WebFlux Spring WebFlux 简称 WebFlux ,是 spring5.0 新引入的一个框架。 SpringBoot 同样为 WebFlux 提供了自动配置。 Spring WebFlux 和 Spring MVC 是属于竞争关系,都是框架。在一个项目中两个也可以同时存在。 SpringMVC 是基于 Servlet A…...
【算法专题突破】双指针 - 和为s的两个数字(6)
目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:剑指 Offer 57. 和为s的两个数字 - 力扣(Leetcode) 这道题题目就一句话但是也是有信息可以提取的, 最重要的就是开始的那句话&#…...
Redis7入门概述
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏…...
SQL sever命名规范
目录 一、标识符 二、表名(Table): 三、字段名(fields): 四、约束(Constraint): 五、索引(Index): 六、存储过程(Stored Proced…...
BCSP-玄子Share-Java框基础_工厂模式/代理模式
三、设计模式 3.1 设计模式简介 软件设计中的三十六计是人们在长期的软件开发中的经验总结是对某些特定问题的经过实践检验的特定解决方法被广泛运用在 Java 框架技术中 3.1.1 设计模式的优点 设计模式是可复用的面向对象软件的基础可以更加简单方便地复用成功的设计和体系…...
【数据结构】2015统考真题 6
题目描述 【2015统考真题】求下面的带权图的最小(代价)生成树时,可能是Kruskal算法第2次选中但不是Prim算法(从v4开始)第2次选中的边是(C) A. (V1, V3) B. (V1, V4) C. (V2, V3) D. (V3, V4) …...
HTML <track> 标签
实例 播放带有字幕的视频: <video width="320" height="240" controls="controls"><source src="forrest_gump.mp4" type="video/mp4" /><source src="forrest_gump.ogg" type="video/ogg…...
php中识别url被篡改并阻止访问的实现方式是什么
在 PHP 中,可以通过多种方式来识别并阻止 URL 被篡改的访问。以下是一些常见的方法: 基本身份验证:使用 PHP 的 $_SERVER[PHP_AUTH_USER] 和 $_SERVER[PHP_AUTH_PW] 变量可以实施基本的 HTTP 身份验证。在访问受保护的页面之前,可…...
c++ 学习 之 const,constexpr,volatile
前言 const、constexpr 和 volatile 是 C 中用于修饰变量和类型的关键字 正文 它们分别用于不同的用途: const(常量): const 用于声明常量,表示变量的值不能被修改。 它可以应用于变量、指针、引用、成员函数以及类…...
【Flink】关于jvm元空间溢出,mysql binlog冲突的问题解决
问题一:7张表是同一个mysql中的,我们进行增量同步时分别用不同的flink任务读取,造成mysql server-id冲突问题,如下: Caused by: io.debezium.DebeziumException: A slave with the same server_uuid/server_id as this…...
C#常用多线程(线程同步,事件触发,信号量,互斥锁,共享内存,消息队列)
using System; using System.Threading; using System.Windows.Forms; using UtilForm.Util;namespace UtilForm {// 线程同步,事件触发,信号量,互斥锁,共享内存,消息队列public partial class frmUIThread : Form{ Sy…...
OpenWrt系统开发笔记
openWrt英文官网: https://openwrt.org/ 中文官网: http://www.openwrt.org.cn/ 一、开发环境及编译 在github上有两个源码使用的比较多 一个是lede,地址为:https://github.com/coolsnowwolf/lede 另一个为OpenWrt的官方源码&#…...
实战 - Restful APi 格式规范
文章目录 1. 特征2. 优点3. 动作1. GET 获取资源2. POST 创建资源3. PUT 整体替换4. PATCH 部分替换5. DELETE 删除资源 4. 示例 RESTful是一种API的设计风格,他和GraphQL ,JSON-RPC,WebService类似,用于定义在CS、BS架构下暴露服…...
《Linux从练气到飞升》No.21 Linux简单实现一个shell
🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…...
【iVX】iVX的低代码未来发展趋势:加速应用开发的创新之路
简介: 随着数字化转型的飞速发展,企业和组织对快速开发和交付高质量应用的需求越来越迫切。低代码开发平台作为一种创新的解决方案,极大地简化了应用程序的开发过程。在这一领域,iVX低代码平台作为领先的创业公司,正在…...
zookee 安装
1、下载安装包 weget https://downloads.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz 方案1:wget是一个下载指令,后面可以跟下载连接去从服务器上下载东西。 方案2:也可以先下载到windows上,再通…...
OpenWrt编译自己的应用程序
编译OpenWrt的应用程序可以参考OpenWrt内部其他应用程序的例程,来编写成自己的应用程序 一、OpenWrt源代码获取与编译 1.1、搭建环境 下载OpenWrt的官方源码: git clone https://github.com/openwrt/openwrt.git1.2、安装编译依赖项 sudo apt update…...
MySQL 50 题。
MySQL 50 题。 文章目录 MySQL 50 题。数据库。sql。 数据库。 CREATE SCHEMA new_schema DEFAULT CHARACTER SET utf8mb4 ;Operation failed: There was an error while applying the SQL script to the database. Executing: CREATE SCHEMA new_schema DEFAULT CHARACTER SE…...
强化学习算法总结 (1)
强化学习算法总结 (1) 1.综述 强化学习是通过与环境进行交互,来实现目标的一种计算方法。 s − a 1 − r − s ′ s - a_1 - r- s s−a1−r−s′ 1.1强化学习优化目标 p o l i c y a r g m a x p o l i c y E ( a , s ) [ r e w a r d ( s , a ) ] policy ar…...
Qt应用开发(基础篇)——向导对话框 QWizard
一、前言 QWizard类继承于QDialog,为有向导界面需求的应用环境提供了一个框架。 对话框窗口 QDialog QWizard向导对话框是一个拥有队列界面的特殊对话框,向导的目的是引导用户一步一步的完成预设的流程。向导常用于软件安装界面向导、硬件线路安装向导、…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
