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是函数式接口,负责发布数据。
//发布者
@FunctionalInterface
public static interface Publisher<T> {
//Publisher中函数subscribe负责绑定Subscriber
public void subscribe(Subscriber<? super T> subscriber);
}
Subscriber
Subscriber是静态内部接口,负责订阅消费数据。Subscriber中定义四个方法,分别是onSubscribe、onNext、onError和onComplete,这四个方法会在相应情况下触发
onSubscribe;订阅成功后触发,并且表明可以开始接收订阅数据了onNext:获取接受数据的下一项onError:在发布者或订阅遇到错误时触发onComplete:接受完所有的数据后触发 //订阅者
public static interface Subscriber<T> {
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<T,R> extends Subscriber<T>, Publisher<R> {
}
static final int DEFAULT_BUFFER_SIZE = 256;
public static int defaultBufferSize() {
return DEFAULT_BUFFER_SIZE;
}
}
Reactor 满足 Reactive 规范Reactor 有两个核心类,Mono 和 Flux,这两个类都实现接口 Publisher,提供了丰富操作符。
Flux 对象实现发布者,返回 N 个元素;Mono 实现发布者,返回
0
0
0 或者
1
1
1 个元素Flux 和 Mono 都是数据流的发布者,使用 Flux 和 Mono 都可以发出三种数据信号

引入响相应的依赖
<dependency>
<groupId>io.projectreactorgroupId>
<artifactId>reactor-coreartifactId>
<version>3.1.5.RELEASEversion>
dependency>
编写代码
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<Integer> 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

Stream<Stream<Object>> streamStream = new ArrayList<>().stream().map(Stream::of);
第二 flatMap
元素映射为流
把每个元素先变成一个流,然后把所有流连接成一个流。
例如:stream 中的 flatmap
Integer[] arr = new Integer[]{1, 2, 3, 4};
//声明集合
List<Integer> list = Arrays.asList(arr);
Stream<Integer> integerStream = list.stream().flatMap((map) -> {
return Stream.of(map + 1);
});