Fork me on GitHub

Reactive Programming

前段时间,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
2
3
public interface Publisher<T> {
public void subscribe(Subscriber<? super T> s);
}
  • Subscriber: 订阅者将自己订阅发布者,指出发布者可以发送多少数据并处理数据。
1
2
3
4
5
6
public interface Subscriber<T> {
public void onSubscribe(Subscription s);
public void onNext(T t);
public void onError(Throwable t);
public void onComplete();
}
  • Subscription: 在发布者方面,订阅将被创建,其将与订阅者共享。
1
2
3
4
public interface Subscription {
public void request(long n);
public void cancel();
}
  • Processor: 处理器可以用于位于发布者和订阅者之间,这样就可以进行数据转换。
1
2
public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {
}

Reactive Streams规范被包含在Java 9的Flow API中。

RxJava项目

RxJava使用观察者模式,构建了一种异步且基于事件的实现,并且提供了处理数据流的丰富操作,是Reactive Streams的主流实现之一。

RxJava 2提供了几个基本类:

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的用法请查看官方文档

求鼓励,求支持!