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

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 &#xff0c;是 spring5.0 新引入的一个框架。 SpringBoot 同样为 WebFlux 提供了自动配置。 Spring WebFlux 和 Spring MVC 是属于竞争关系&#xff0c;都是框架。在一个项目中两个也可以同时存在。 SpringMVC 是基于 Servlet A…...

【算法专题突破】双指针 - 和为s的两个数字(6)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 1. 题目解析 题目链接&#xff1a;剑指 Offer 57. 和为s的两个数字 - 力扣&#xff08;Leetcode&#xff09; 这道题题目就一句话但是也是有信息可以提取的&#xff0c; 最重要的就是开始的那句话&#…...

Redis7入门概述

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…...

SQL sever命名规范

目录 一、标识符 二、表名&#xff08;Table&#xff09;: 三、字段名&#xff08;fields&#xff09;&#xff1a; 四、约束&#xff08;Constraint&#xff09;&#xff1a; 五、索引&#xff08;Index&#xff09;&#xff1a; 六、存储过程&#xff08;Stored Proced…...

BCSP-玄子Share-Java框基础_工厂模式/代理模式

三、设计模式 3.1 设计模式简介 软件设计中的三十六计是人们在长期的软件开发中的经验总结是对某些特定问题的经过实践检验的特定解决方法被广泛运用在 Java 框架技术中 3.1.1 设计模式的优点 设计模式是可复用的面向对象软件的基础可以更加简单方便地复用成功的设计和体系…...

【数据结构】2015统考真题 6

题目描述 【2015统考真题】求下面的带权图的最小&#xff08;代价&#xff09;生成树时&#xff0c;可能是Kruskal算法第2次选中但不是Prim算法&#xff08;从v4开始&#xff09;第2次选中的边是&#xff08;C&#xff09; 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 中&#xff0c;可以通过多种方式来识别并阻止 URL 被篡改的访问。以下是一些常见的方法&#xff1a; 基本身份验证&#xff1a;使用 PHP 的 $_SERVER[PHP_AUTH_USER] 和 $_SERVER[PHP_AUTH_PW] 变量可以实施基本的 HTTP 身份验证。在访问受保护的页面之前&#xff0c;可…...

c++ 学习 之 const,constexpr,volatile

前言 const、constexpr 和 volatile 是 C 中用于修饰变量和类型的关键字 正文 它们分别用于不同的用途&#xff1a; const&#xff08;常量&#xff09;&#xff1a; const 用于声明常量&#xff0c;表示变量的值不能被修改。 它可以应用于变量、指针、引用、成员函数以及类…...

【Flink】关于jvm元空间溢出,mysql binlog冲突的问题解决

问题一&#xff1a;7张表是同一个mysql中的&#xff0c;我们进行增量同步时分别用不同的flink任务读取&#xff0c;造成mysql server-id冲突问题&#xff0c;如下&#xff1a; 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 {// 线程同步&#xff0c;事件触发&#xff0c;信号量&#xff0c;互斥锁&#xff0c;共享内存&#xff0c;消息队列public partial class frmUIThread : Form{ Sy…...

OpenWrt系统开发笔记

openWrt英文官网&#xff1a; https://openwrt.org/ 中文官网&#xff1a; http://www.openwrt.org.cn/ 一、开发环境及编译 在github上有两个源码使用的比较多   一个是lede,地址为&#xff1a;https://github.com/coolsnowwolf/lede   另一个为OpenWrt的官方源码&#…...

实战 - Restful APi 格式规范

文章目录 1. 特征2. 优点3. 动作1. GET 获取资源2. POST 创建资源3. PUT 整体替换4. PATCH 部分替换5. DELETE 删除资源 4. 示例 RESTful是一种API的设计风格&#xff0c;他和GraphQL &#xff0c;JSON-RPC&#xff0c;WebService类似&#xff0c;用于定义在CS、BS架构下暴露服…...

《Linux从练气到飞升》No.21 Linux简单实现一个shell

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…...

【iVX】iVX的低代码未来发展趋势:加速应用开发的创新之路

简介&#xff1a; 随着数字化转型的飞速发展&#xff0c;企业和组织对快速开发和交付高质量应用的需求越来越迫切。低代码开发平台作为一种创新的解决方案&#xff0c;极大地简化了应用程序的开发过程。在这一领域&#xff0c;iVX低代码平台作为领先的创业公司&#xff0c;正在…...

zookee 安装

1、下载安装包 weget https://downloads.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz 方案1&#xff1a;wget是一个下载指令&#xff0c;后面可以跟下载连接去从服务器上下载东西。 方案2&#xff1a;也可以先下载到windows上&#xff0c;再通…...

OpenWrt编译自己的应用程序

编译OpenWrt的应用程序可以参考OpenWrt内部其他应用程序的例程&#xff0c;来编写成自己的应用程序 一、OpenWrt源代码获取与编译 1.1、搭建环境 下载OpenWrt的官方源码&#xff1a; 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.综述 强化学习是通过与环境进行交互&#xff0c;来实现目标的一种计算方法。 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&#xff0c;为有向导界面需求的应用环境提供了一个框架。 对话框窗口 QDialog QWizard向导对话框是一个拥有队列界面的特殊对话框&#xff0c;向导的目的是引导用户一步一步的完成预设的流程。向导常用于软件安装界面向导、硬件线路安装向导、…...

Python类的方法

Python类的方法主要分为实例方法、类方法和静态方法三种。 1 实例方法 以self作为第一个参数的方法&#xff0c;就是类的实例方法。该方法由类的实例调用&#xff0c;Python会把调用该方法的实例对象传递给self。 如下代码定义了一个名为A的类。 class A:def __init__(self…...

变电站自动化监控系统

力安科技变电站自动化监控系统是以箱式变电站为管理对象&#xff0c;加装箱变网关&#xff0c;在完成箱变智能化改造的基础上&#xff0c;依托电易云&#xff0c;构建一体化智慧箱变及运维系统。智能箱式变电站被广泛应用于住宅小区、城市公用变压器、工厂、商场、机场、电站等…...

MySql学习笔记11——DBA命令介绍

DBA命令 数据导入 要进入Mysql 创建数据库 create database database_name;使用数据库 use database_name;初始化数据库 source .sql文件地址&#xff0c;不能加双引号&#xff1b;数据导出 要在windows的dos环境下进行 导出数据库 mysqldump database_name > 存放…...

Webpack 复习小结

nodejs学习参考 node常用命令&#xff1a; node xxx.js 执行js文件 npm init -y 初始化package.json npm i 软件包名 下载软件包到本地 npm i 软件包名 -g 下载软件包到全局 npm uni 软件包名 删除软件包 系统优化CDN使用 CDN for free 需求&#xff1a;开发模式使用本地第三…...

Laravel chunk和chunkById的坑

在编写定时任务脚本的时候&#xff0c;经常会用到chunk和chunkById的API。 一、前言 数据库引擎为innodb。 表结构简述&#xff0c;只列出了本文用到的字段。 字段类型注释idint(11)IDtypeint(11)类型mark_timeint(10)标注时间&#xff08;时间戳&#xff09; 索引&#x…...

从零开始学习 Java:简单易懂的入门指南之泛型及set集合(二十二)

泛型及set集合扩展 1.泛型1.1泛型概述 2.Set集合2.1Set集合概述和特点【应用】2.2Set集合的使用【应用】 3.TreeSet集合3.1TreeSet集合概述和特点【应用】3.2TreeSet集合基本使用【应用】3.3自然排序Comparable的使用【应用】3.4比较器排序Comparator的使用【应用】3.5两种比较…...

JVM----GC(垃圾回收)详解

一、Automatic Garbage Collection&#xff08;垃圾回收&#xff09;简介 Automatic Garbage Collection &#xff08;自动垃圾回收&#xff09;是JVM的一个特性&#xff0c;JVM会启动相关的线程&#xff0c;该线程会轮训检查heap memeory&#xff0c;并确定哪些是未被引用的(…...

数据库的三个范式

数据库的三个范式是关系数据库设计中的一组规范&#xff0c;用于确保数据的有效性和一致性。这三个范式分别是&#xff1a; 第一范式&#xff08;1NF&#xff09;&#xff1a;要求数据库表中的每一列都是不可分割的原子值。换句话说&#xff0c;每个表中的每个字段不能包含多个…...

谷歌浏览器打开白屏 后台还有还有很多google chrome进程在运行

环境&#xff1a; Win10 专业版 谷歌浏览器 版本 116.0.5845.141&#xff08;正式版本&#xff09; &#xff08;64 位&#xff09; L盾加密终端 问题描述&#xff1a; 谷歌浏览器打开白屏 后台还有还有很多google chrome进程在运行&#xff0c;要全部结束谷歌浏览器进程&…...

Java EE 突击 15 - Spring Boot 统一功能处理

Spring Boot 统一功能处理 一 . 统一功能的处理1.1 初级阶段 : 不断重复1.2 中级阶段 : 集成方法1.3 高级阶段 : Spring AOP1.4 超高级阶段 : Spring 拦截器准备工作实现拦截器自定义拦截器将自定义拦截器加入到系统配置 拦截器实现原理扩展 : 统一访问前缀添加 二 . 统一异常的…...