• 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  接口,它们的区别在于:
    
    - Mono代表0~1个非阻塞数据;而Flux则代表0~N数据个非阻塞序列。
    - Mono相当于只是一个Optional值;而Flux才是Stream。
    
    • 1
    • 2
    • 3
    • 4

    基本原理,其实就是基于 消息发布 - 消息订阅 的异步通信方式。


    ★ Spring WebFlux

    Spring WebFlux 就是基于 Reactor 实现的,其中 Flux 名称就是来自 Reactor 中的 Flux类,WebFlux 包括了对反应式 HTTP、服务器推送事件(SSE:Server Send Event)及WebSocket的支持。


    Spring WebFlux 提供了两种开发方式:

    1、使用类似Spring MVC的注解方式。在这种方式下,依然使用@Controller、@RequestMapping等注解修饰类、方法即可。

    2、使用函数式编程模型的方式。在这种方式下,程序使用RouterFunction来注册映射地址和处理器方法之间路由关系。

    上面这两种编程模型只是形式上有所不同(代码编写方式上存在不同),它们本质上完全是一样的,它们都运行在相同的反应式流的基础之上。


    ★ Spring MVC VS Spring WebFlux 的区别


    Spring MVC

    Spring MVC 基于传统 Servlet,服务器需要使用很大的线程池才能支持大量的并发请求;

    HttpServletRequest 来获取请求参数:getParameter(),它是一个典型的同步方法,该方法的返回值是String类型。
    ——这意味着在没有获取请求参数之前,该方法就会阻塞线程,这就是同步。

    HttpServletResponse 来生成响应,它也是同步:服务器生成的响应完全发送给客户端之前,该线程什么也做不了。

    这种同步的设计意味着,每当一个客户端请求到来时,必须启动单独的线程来为该请求提供服务。

    当请求的并发数量非常大时,只能通过水平的集群扩展、增加更多集群节点来处理这些并发请求。

    Spring WebFlux

    Spring WebFlux 采用异步、非阻塞的编程模型,底层反应式容器无需启动额外的线程。

    ServerRequest 来获取请求参数,
    比如 :

     bodyToFlux(Class elementClass)、
     bodyToMono(Class elementClass)、
     formData()
    
    • 1
    • 2
    • 3

    这些的返回值都是 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 默认功能的基础上添加了如下特性:

    1、为 HttpMessageReader 和 HttpMessageWriter 实例配置了 codecs。

    2、对服务器静态资源提供支持,包括对 WebJars 的支持。


    ★ 对WebFlux自动配置进行定制

    若要在保留自动配置的基础上增加一些自定义的 Spring WebFlux 配置(例如添加拦截器、格式化器、视图控制器等),则可通过实现自己的 WebFluxConfigurer 类,并使用 @Configuration 注解修饰该类、但不要使用 @EnableWebFlux 注解修饰。

    实现该类的如下方法:

    - addFormatters(FormatterRegistry registry):添加格式化器
    - configureArgumentResolvers(ArgumentResolverConfigurer configurer):配置参数解析器
    - configurePathMatching(PathMatchConfigurer configurer):配置路径匹配器
    - configureViewResolvers(ViewResolverRegistry registry):配置视图解析器
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ★ 全面接管

    如果使用 @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文件作为应用的图标。

  • 相关阅读:
    java课程设计:基于SSM实现个人健康管理系统
    Spring学习笔记2 Spring的入门程序
    循序渐进了解如何使用JSR303进接口数据校验
    2、ARM处理器概论
    ElasticSearch之Quick.ElasticSearch.Furion组件的使用
    (2022版)一套教程搞定k8s安装到实战 | RBAC
    技术干货分享:Kvaser Leaf的 D-SUB 9连接器DB9接头的引脚定义图,另附kvaser的多款怎么选型?
    学懂C#编程:常用高级技术——学会C#的高级特性 反射
    分享这几个好用的文字识别软件,教你快速识别
    使用 PointNet 进行3D点集(即点云)的分类
  • 原文地址:https://blog.csdn.net/weixin_44411039/article/details/132678790