vlambda博客
学习文章列表

反应式编程reactor简单理解

 

SpringGateway实现

springgateway是基于webflux的响应式编程,而webflux采用的是Reactor

关于Reactor的介绍

 Reactor是Spring中的一个子项目是一个基于java的响应式编程框架


关于反应式编程的思想

反应式编程框架主要采用了观察者模式,为了方便下面理解Mono和Flux,也可以理解为Publisher(发布者也可以理解为被观察者)主动推送数据给Subscriber(订阅者也可以叫观察者),如果Publisher发布消息太快,超过了Subscriber的处理速度,如何处理。这时就出现了Backpressure(背压-----指在异步场景中,被观察者发送事件速度远快于观察者的处理速度的情况下,一种告诉上游的被观察者降低发送速度的策略)


反应式编程概览

    命令式编程看作是水气球,而将反应式编程看作是花园里的软管。反应式流旨在提供无阻塞回压的异步流处理标准。Java的流通常都是同步的,并且只能处理有限的数据集。从本质上来说,它们只是使用函数来对集合进行迭代的一种方式。Java的流通常都是同步的,并且只能处理有限的数据集。从本质上来说,它们只是使用函数来对集合进行迭代的一种方式。反应式流支持异步处理任意大小的数据集,同样也包括无限数据集。只要数据就绪,它们就能实时地处理数据,并且能够通过回压来避免压垮数据的消费者。反应式流规范可以总结为4个接口:Publisher、Subscriber、Subscription和Processor。Publisher负责生成数据,并将数据发送给Subscription(每个Subscriber对应一个Subscription)。Publisher接口声明了一个方法subscribe(),Subscriber可以通过该方法向Publisher发起订阅。反应式流支持异步处理任意大小的数据集,同样也包括无限数据集。只要数据就绪,它们就能实时地处理数据,并且能够通过回压来避免压垮数据的消费者。反应式流规范可以总结为4个接口:Publisher、Subscriber、Subscription和Processor。Publisher负责生成数据,并将数据发送给Subscription(每个Subscriber对应一个Subscription)。Publisher接口声明了一个方法subscribe(),Subscriber可以通过该方法向Publisher发起订阅。当调用request()时,Subscriber可以传入一个long类型的数值以表明它愿意接受多少数据。这也是回压能够发挥作用的地方


初识Reactor

Mono是Reactor的两种核心类型之一,另一个类型是Flux。两者都实现了反应式流的Publisher接口。Flux代表具有零个、一个或者多个(可能是无限个)数据项的管道。Mono是一种特殊的反应式类型,针对数据项不超过一个的场景,它进行了优化。

 

使用常见的反应式操作

Flux和Mono是Reactor提供的最基础的构建块,而这两种反应式类型所提供的操作符则是组合使用它们以构建数据流动管线的黏合剂。Flux和Mono共有500多个操作,这些操作都可以大致归类为:•创建操作;•组合操作;•转换操作;•逻辑操作。操作可多达到500多个操作。


 反应式编程会涉及创建数据流经的处理管道。•反应式流规范定义了4种类型:Publisher、Subscriber、Subscription和Processor(它是Publisher和Subscriber的组合)。•Reactor项目实现了反应式流规范,将反应式流的定义抽象为两个主要的类型,即Flux和Mono,并为每种类型都提供数百个操作。•Spring 5利用Reactor提供了反应式控制器、repository、REST客户端以及其他反应式框架的支持。


思考:Mono vs Flux in Reactive Stream

创建响应流的过程


使用Flux或Mono上的静态just()方法来创建一个反应式类型:


Mono<String> mn = Mono.just("hello");

 


Flux<String> fl = Flux.just("a", "b", "c");

在许多情况下,在进行一些计算或调用一个服务,您只希望得到一个结果(或者可能是零个或一个结果),而不是一个可能包含多个结果的集合。在这种情况下,Mono单声道更方便。