Spring WebFlux介绍
-
是Spring5添加新的模块,用于web开发的,功能和SpringMVC类似的,Webflux使用当前一种比较流行响应式编程出现的框架。
-
使用传统web框架,比如SpringMVC,这些基于Servlet容器,Webflux是一种异步非阻塞的框架,异步非阻塞的框架在Servlet3.1以后才支持,核心是基于Reactor的相关API实现的。
-
什么是异步非阻塞
- 异步和同步、非阻塞和阻塞 两者都是针对对象不一样。
- 异步和同步针对调用者,调用者发送请求,如果等着对方回应之后才去做其他事情就是同步,如果发送请求之后不等着对方回应就去做其他事情就是异步。
- 阻塞和非阻塞针对被调用者,被调用者受到请求之后,做完请求任务之后才给出反馈就是阻塞,受到请求之后马上给出反馈然后再去做事情就是非阻塞。
-
Webflux特点:
- 非阻塞式:在有限资源下,提高系统吞吐量和伸缩性,以Reactor为基础实现响应式编程。
- 函数式编程:Spring5框架基于java8,Webflux使用java7函数式编程方式实现路由请求。
-
比较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