Spring 5.x的最大的更新是将响应式编程作为头等的支持,响应式开发将极大的提升应用系统的性能。响应式应用是完全异步和非阻碍的,需要应用的每个环节都是异步非阻碍的,所以Spring对响应式编程进行了全角度的支持:
- Web:Spring WebFlux和WebFlux.fn
- 数据库: Reactive Spring Data
- 安全:Reactive Spring Security
- 客户端:
WebClient
Spring 的响应式编程是以Project Reactor为基石的,它用来构建基于JVM Reactive Streams规范的非阻碍式应用。
1. Project Reactor
使用Intellij IDEA新建Gradle
应用:
GroupId: top.wisely
ArtifactId:learning-reactor
依赖添加:
dependencies {
compile 'io.projectreactor:reactor-core:3.2.9.RELEASE'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
1.1 Reactive Streams的基础接口
Reactor基于Reactive Streams规范,我们先了解一下Reactive Streams的主要接口:
-
Publisher
:顾名思义为为发布者,是一些列数据的提供者;它根据订阅者(Subscriber
)的要求将数据推送给订阅;一个发布者可以服务多个订阅者。public interface Publisher<T> { public void subscribe(Subscriber<? super T> s); }
订阅者通过
subscribe
方法订阅发布者,请求发布者开始传递数据;它可以被调用多次,每一次调用都会开始一个新的订阅(Subscription
);每一个订阅只为一个订阅者服务。 -
Subscriber
:订阅者,public interface Subscriber<T> { public void onSubscribe(Subscription s); //1 public void onNext(T t); //2 public void onError(Throwable t); //3 public void onComplete(); //4 }
- 当
Publisher.subscribe(Subscriber)
执行时被调用。此时没有数据传输直至Subscription.request(long)
被调用; - 当请求
Subscription.request(long)
,由发布者发送的数据通知;方法会被一次或多次被调用,这依赖于Subscription.request(long)
中定义的最大数量。 - 失败结束状态;
- 成功结束状态。
- 当
-
Subscription
:订阅代表一次订阅者订阅发布者的生命周期;它只能被一个订阅者使用,它既可以用来通知传递数据也可以取消传递。public interface Subscription { public void request(long n); //1 public void cancel(); //2 }
- 若不调用此方法,发布者不会发送任何数据;参数
n
的最大取值为Long.MAX_VALUE
,若取值为Long.MAX_VALUE
意味着发布者的数据是无限的; - 请求发布者停止发送数据并清理资源。
- 若不调用此方法,发布者不会发送任何数据;参数
-
Processor
:处理器代表一个处理阶段,它即是订阅者又是发布者。A Processor represents a processing stage—which is both a Subscriber and a Publisher and obeys the contracts of bothpublic