从响应式编程说起
响应式编程是一种关注于数据流(data streams)和变化传递(propagation of change)的异步编程方式。 这意味着它可以用既有的编程语言表达静态(如数组)或动态(如事件源)的数据流。
在响应式编程方面,微软跨出了第一步,它在 .NET 生态中创建了响应式扩展库(Reactive Extensions library, Rx)。接着 RxJava 在 JVM 上实现了响应式编程。后来,在 JVM 平台出现了一套标准的响应式 编程规范,它定义了一系列标准接口和交互规范。并整合到 Java 9 中(Flow 类)。
响应式编程通常作为面向对象编程中的“观察者模式”(Observer design pattern)的一种扩展。 响应式流(reactive streams)与“迭代子模式”(Iterator design pattern)也有相通之处, 因为其中也有 Iterable-Iterator 这样的对应关系。主要的区别在于,Iterator 是基于 “拉取”(pull)方式的,而响应式流是基于“推送”(push)方式的。
- iterator 是一种“命令式”(imperative)编程范式,即使访问元素的方法是 Iterable 的唯一职责。关键在于,什么时候执行 next() 获取元素取决于开发者。
- 响应式流中,相对应的角色是 Publisher-Subscriber,但是当有新的值到来的时候 ,却反过来由发布者(Publisher) 通知订阅者(Subscriber),这种“推送”模式是响应式的关键
此外,对推送来的数据的操作是通过一种声明式(declaratively)而不是命令式(imperatively)的方式表达的:开发者通过描述“控制流程”来定义对数据流的处理逻辑。
除了数据推送,对错误处理(error handling)和完成(completion)信号的定义也很完善。一个 Publisher 可以推送新的值到它的 Subscriber(调用 onNext 方法), 同样也可以推送错误(调用 onError 方法)和完成(调用 onComplete 方法)信号。 错误和完成信号都可以终止响应式流。可以用下边的表达式描述:
onNext x 0..N [onError | onComplete]
这种方式非常灵活,无论是有/没有值,还是 n 个值(包括有无限个值的流,比如时钟的持续读秒),都可处理。
以上来自 projectreactor.io/docs/core/r… 翻译
(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程。完全免费哦!)
Reactive Streams
Reactive Streams 是上面提到的一套标准的响应式编程规范。它由四个核心概念构成:
-
消息发布者:只有一个 subscribe 接口,是订阅者调用的,用来订阅发布者的消息。发布者在订阅者调用 request 之后把消息 push 给订阅者。
public interface Publisher<T> { public void subscribe(Subscriber<? super T> s); }
-
订阅者:订阅者包括四个接口,这些接口都由 Publisher 触发调用的。onSubscribe 告诉订阅者订阅成功,并返回了一个 Subscription ;通过 Subscription 订阅者可以告诉发布者发送指定数量的消息(request 完成) ;onNext 是发布者有消息时,调用订阅者这个接口来达到发布消息的目的;onError 通知订阅者,发布者出现了错误;onComplete 通知订阅者消息发送完毕。
public interface Subscriber<T> { public void onSubscribe(Subscription s); public void onNext(T t); public void onError(Throwable t); public void onComplete();
}
-
订阅:包括两个接口,请求 n 个消息和取消此次订阅。
public interface Subscription { // request(n)用来发起请求数据,其中n表示请求数据的数量,它必须大于0, // 否则会抛出IllegalArgumentException,并触发onError,request的调用会 // 累加,如果没有终止,最后会触发相应次数的onNext方法. public void request(long n); // cancel相当于取消订阅,调用之后,后续不会再收到订阅,onErro