Spring系列--WebFlux详解

Spring WebFlux介绍

  1. 是Spring5添加新的模块,用于web开发的,功能和SpringMVC类似的,Webflux使用当前一种比较流行响应式编程出现的框架。 在这里插入图片描述

  2. 使用传统web框架,比如SpringMVC,这些基于Servlet容器,Webflux是一种异步非阻塞的框架,异步非阻塞的框架在Servlet3.1以后才支持,核心是基于Reactor的相关API实现的。

  3. 什么是异步非阻塞

    • 异步和同步、非阻塞和阻塞 两者都是针对对象不一样。
    • 异步和同步针对调用者,调用者发送请求,如果等着对方回应之后才去做其他事情就是同步,如果发送请求之后不等着对方回应就去做其他事情就是异步。
    • 阻塞和非阻塞针对被调用者,被调用者受到请求之后,做完请求任务之后才给出反馈就是阻塞,受到请求之后马上给出反馈然后再去做事情就是非阻塞。
  4. Webflux特点:

    • 非阻塞式:在有限资源下,提高系统吞吐量和伸缩性,以Reactor为基础实现响应式编程。
    • 函数式编程:Spring5框架基于java8,Webflux使用java7函数式编程方式实现路由请求。
  5. 比较SpringMVC
    在这里插入图片描述

    • 两个框架都可以使用注解方式,都运行在Tomcat等容器中。
    • SpringMVC采用命令式编程,Webflux采用异步响应式编程。

响应式编程(Java实现)

什么是响应式编程

响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流。而相关的计算模型会自动将变化的值通过数据流进行传播。

例如,在命令式编程环境中,a=b+c表示将表达式的结果赋给a,而之后改变b或c的值不会影响a。但在响应式编程中,a的值会随着b或c的更新而更新。

Java8及其之前版本实现响应式编程

提供的观察者模式两个类 Observer和Observable

public class ObserverDemo extends Observable {
   
   
    public static void main(String[] args) {
   
   
        ObserverDemo observer = new ObserverDemo();
        //添加观察者
        observer.addObserver((o,arg)->{
   
   
            System.out.println("发生变化");
        });

        observer.addObserver((o,arg)->{
   
   
            System.out.println("收到被观察者通知,准备改变");
        });

        observer.setChanged(); //数据变化
        observer.notifyObservers(); //通知
    }
}

响应式编程(Reactor实现)

响应式编程操作中,Reactor是满足Reactive规范框架。

Reactor有两个核心类,Momo和Flux,这两个类实现接口Publisher,提供丰富操作符。Flux对象实现发布者,返回N个元素;Mono实现发布者,返回0或者1个元素。

Flux和Mono都是数据流的发布者,使用Flux和Mono都可以发出三种数据信号:元素值、错误信号、完成信号,错误信号和完成信号都代表终止信号,终止信号用于告诉订阅者数据流结束了,错误信号终止数据流同时把错误信息传递给订阅者。

在这里插入图片描述
代表演示Flux和Mono
1.引入依赖

	<dependency>
  	   <groupId>io.projectreactor</groupId>
       <artifactId>reactor-core</artifactId>
       <version>3.1.5.RELEASE</version>
   </dependency>

2.编写代码

public class TestReactor {
   
   
    public static void main(String[] args) {
   
   
        //just方法声明 发送数据流
        Flux.just(1,2,3,4);
        Mono.just(1);

        //其他的方式 发送数据流
        //数组
        Integer[] array = {
   
   1,2,3,4};
        Flux.fromArray(array);
        
        //列表
        List<Integer> list = Arrays.asList(array);
        Flux.fromIterable(list);
        
        //Stream流
        Stream<Integer> stream = list.stream();
        Flux.fromStream(stream);
    }
}

三种信号的特点:

  • 错误信号和完成信号都是终止信号,不能共存的。
  • 如果没有发送任何元素值,而是直接发送错误或者完成信号,表示是空数据流。
  • 如果没有错误信号,没有完成信号,表示是无限数据流。

调用just或者其他方法只是声明数据流,数据流并没有发出,只有进行订阅之后才会触发数据流,不订阅什么都不会发生的。

//just方法声明 发送数据流
Flux.just(1,2,3
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值