前段时间,Spring 5的发布给我们带来了WebFlux模块,其主要核心是Reactive Programming。
在介绍WebFlux之前,我们需要一些背景知识。
Reactive Streams
Reactive Streams的目的是为非阻塞的异步流处理提供一个标准。
一些相关资料:
Reactive Streams定义的JVM规范如下:
- 处理可能无限数量的元素
- 按顺序处理
- 在组件之间异步传递元素
- 具有强制性的非阻塞的backpressure
Reactive Streams规范由以下两部分组成:
- API: 定义要实现的类型,并实现不同类型之间的交互操作。
- Technology Compatibility Kit (TCK): 用于实现一致性测试的标准测试套件。
只要符合API要求并通过TCK中的测试,实现就可以自由地实现规范未涵盖的其他功能。
API组件
- Publisher: 发布者将数据发送给一个或多个订阅者。
1 | public interface Publisher<T> { |
- Subscriber: 订阅者将自己订阅发布者,指出发布者可以发送多少数据并处理数据。
1 | public interface Subscriber<T> { |
- Subscription: 在发布者方面,订阅将被创建,其将与订阅者共享。
1 | public interface Subscription { |
- Processor: 处理器可以用于位于发布者和订阅者之间,这样就可以进行数据转换。
1 | public interface Processor<T, R> extends Subscriber<T>, Publisher<R> { |
Reactive Streams规范被包含在Java 9的Flow API中。
RxJava项目
RxJava使用观察者模式,构建了一种异步且基于事件的实现,并且提供了处理数据流的丰富操作,是Reactive Streams的主流实现之一。
RxJava 2提供了几个基本类:
- io.reactivex.Flowable: 返回N个元素,支持Reactive Streams和backpressure。
- io.reactivex.Observable: 返回N个元素,不支持backpressure。
- io.reactivex.Single: 返回1个元素或者error。
- io.reactivex.Completable: 没有元素,只有完成和error信号。
- io.reactivex.Maybe: 返回0个元素,1个元素或者error。
Reactor项目
Reactor是基于Reactive Streams规范提供的一个Reactive库,是Reactive Streams的另一主流实现。
Reactor提供两种类型:
- Mono: 实现了Publisher,返回0或1个元素。
- Flux: 实现了Publisher,返回N个元素。
API练习项目:
Spring WebFlux
Spring WebFlux是完全非阻塞的,支持Reactive Streams的back pressure,可以运行在例如Netty、Undertow和Servlet 3.1+容器上。
Spring Framework内部采用Reactor来支持响应式编程。在应用层,用户也可以选择使用Spring提供的对RxJava的全面支持。
更多WebFlux的用法请查看官方文档。