什么是响应式编程
在计算机中,响应式编程或反应式编程(英语:Reactive programming)是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
观察者模式
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(); //通知
} }
java9及以后版本提供了,Flow类(subcribe订阅,publish发布)
Reactor实现 响应式编程
满足Reactive规范的架构
Reactor有两个核心类,mono和flux,这两个类都实现了Publisher,提供了丰富的操作符。Flux实现发布者,返回n个元素;Mono实现发布者,返回一个或0个元素。
Flux和Mono都是数据流的发布者,使用Flux和Mono都可以发出三种数据信号(元素值,错误信号,完成信号)(错误信号和完成信号都代表终止信号,错误信号终止数据流时火把错误信息传递给订阅者)
代码演示Flux和Mono
第一步,引入依赖
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
<version>3.1.5.RELEASE</version>
</dependency>
TestReactor
//生成Reactor规范的对象
Flux.just(var ... args);
Mono.just(var arg);
Flux.fromArray(array);
Flux.fromStream(stream);
Flux.fromIterable(collection);
数据流,三种数据信号(元素值,错误信号,完成信号)特点
- 错误信号和完成信号只能存在一个。
- 没有元素值,表示这个流是空数据流
- 没有终止信号,表示这个流是无限数据流
- 操作符只用于加工数据(就是方法,map(多个元素映射为新的多个元素),flatMap(多个元素映射(合并)为一个流))
数据流订阅后才会执行。
springwebflux执行流程和核心API
springwebflux基于Reactor,默认容器是Netty,Netty是高性能,NIO框架,异步非阻塞的框架。
SpringWebFlux执行过程
springwebflux核心控制器DispatcherHandler,实现了WebHandler
其他组件
HandlerMapping:通过客户端请求查询处理方法
HandlerAdapter:负责请求处理,实现具体业务方法
HandlerResultHandler:负责响应结果,处理结果
实现函数式编程API(RouterFunction,HandlerFunction)
RouterFunction:(路由处理:处理请求,找到方法)
HandlerFunction:(函数处理:处理请求,响应函数)