SpringMVC,SpringBoot,Maven,Java8 新特性
官方文档
Web on Reactive Stack (spring.io)
是 Spring5 添加新的模块,用于 web 开发的,功能 SpringMVC 类似的,WebFlux 使用当前一种比较流程响应的编程出现的框架
使用传统 web 框架,比如 SpringMVC,这些基于 Servlet 容器, WebFlux 是一种异步非阻塞的框架,异步非阻塞的框架在 Servlet3.1 以后才支持。核心是基于 Reactor 的相关 API 实现的
什么是异步非阻塞
调用者,调用者发请求,被调用者特点:
Reactor 为基础实现响应式编程Spring5 框架基于 java8,WebFlux 使用 Java8 函数式编程方式实现路由请求比较 SpringMVC

Tomcat 容器中SpringMVC 采用命令式编程,WebFlux 采用异步响应式[响应式编程](响应式编程_百度百科 (baidu.com))是一种面向数据流和变化传播的编程范式。
这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
电子表格程序就是响应式编程的一个例子。单元格可以包含字面值或类似"=B1+C1"的公式,而包含公式的单元格的值会依据其他单元格的值的变化而变化。

Observer 和 Observableimport java.util.Observable;
public class ObserverDemo extends Observable {public static void main(String[] args) {ObserverDemo data = new ObserverDemo();//添加观察者data.addObserver((o, a) -> {System.out.println("发生了变化:" + a);});//添加观察者data.addObserver((o, a) -> {System.out.println("收到被观察者通知,准备改变:" + a);});data.setChanged();//数据变化data.notifyObservers("hello");//通知data.clearChanged();}
}
测试结果

发布订阅

Publisher
Publisher是函数式接口,负责发布数据。Publisher中函数subscribe负责绑定Subscriber
//Publisher是函数式接口,负责发布数据。//发布者@FunctionalInterfacepublic static interface Publisher {//Publisher中函数subscribe负责绑定Subscriberpublic void subscribe(Subscriber super T> subscriber);}
Subscriber
Subscriber是静态内部接口,负责订阅消费数据。Subscriber中定义四个方法,分别是onSubscribe、onNext、onError和onComplete,这四个方法会在相应情况下触发
onSubscribe;订阅成功后触发,并且表明可以开始接收订阅数据了onNext:获取接受数据的下一项onError:在发布者或订阅遇到错误时触发onComplete:接受完所有的数据后触发 //订阅者public static interface Subscriber {public void onSubscribe(Subscription subscription);public void onNext(T item);public void onError(Throwable throwable);public void onComplete();}
Subscription
Subscription关联Publisher和Subscriber,表示Publisher和Subscriber的订阅关系。Subscription使用request和cancel方法管理Publisher到Subscriber的消费
request:请求获取数据的次数cancel:取消订阅,订阅者不在接受数据 public static interface Subscription {public void request(long n);public void cancel();}
Processor
Processor继承了Publisher和Subscriber接口,表示既是生产者,又是订阅者的特殊对象。Processor一般作为数据的中转处理站, 将数据处理之后发给下个订阅者
public final class Flow {private Flow() {} // 不可实例化public static interface Processor extends Subscriber, Publisher {}static final int DEFAULT_BUFFER_SIZE = 256;public static int defaultBufferSize() {return DEFAULT_BUFFER_SIZE;}}
Reactor 满足 Reactive 规范Reactor 有两个核心类,Mono 和 Flux,这两个类都实现接口 Publisher,提供了丰富操作符。 Flux 对象实现发布者,返回 N 个元素;Mono 实现发布者,返回 000 或者 111 个元素Flux 和 Mono 都是数据流的发布者,使用 Flux 和 Mono 都可以发出三种数据信号 
引入响相应的依赖
io.projectreactor reactor-core 3.1.5.RELEASE
编写代码
public class TestReactor {public static void main(String[] args) {//just方法直接声明(就是发布者发布了一些数据)Flux.just(1, 2, 3, 4);Mono.just(1);//其他的方法Integer[] arr = new Integer[]{1, 2, 3, 4};Flux.fromArray(arr);//声明集合List list = Arrays.asList(arr);Flux.fromIterable(list);//声明流Flux.fromStream(list.stream());}
}
没有订阅者,是不会输出的。
just 或者其他方法只是声明数据流,数据流并没有发出,只有进行订阅之后才会触发数据流。1.声明订阅者
public class TestReactor {public static void main(String[] args) {//just方法直接声明(就是发布者发布了一些数据),接收者进行消费Flux.just(1, 2, 3, 4).subscribe(System.out::println);Mono.just(1).subscribe(System.out::println);
2.输出结果

空数据流无限数据流例如:
public class TestReactor {public static void main(String[] args) {//错误信号Flux.error(new RuntimeException());}
}
对数据流进行一道道操作,称为操作符,不如工厂的流水线
就和 stream 流一样
第一 map

第二 flatMap
元素映射为流
把每个元素先变成一个流,把每个流封装成一个大流返回
例如:stream 中的 flatmap
Integer[] arr = new Integer[]{1, 2, 3, 4};
//声明集合
List list = Arrays.asList(arr);
Stream integerStream = list.stream().flatMap((map) -> {return Stream.of(map + 1);
});