前段时间,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的用法请查看官方文档。

