(一)响应式编程基础概念
响应式编程基础概念
JDK常用函数类型示例
-
Supplier
- 说明: 没有输入 只有1个输出.
-
Consumer
- 说明: 只有1个输入 没有输出.
-
Function<T,R>- 说明: 输入是T类型 输出是R类型
-
UnaryOperator<T> extends Function<T,T>- 说明:输入和输出都是T
-
BiFunction<T,U,R>- 说明: 输入T和U返回R
JDK Stream 编程
-
什么是Stream?
- 流中元素类型可以是对象,基本数据类型(int,double,long)
-
流是怎么创建的?
- 数组
Arrays.stram() - 集合
Arrays.asList() Stream.Of(arr/list/...)- 迭代器 打印1-10元素
Stream.iterate(1,i->i+1).limit(10).forEach(System.out::println)
- generate
- 打印随机数前10个
Stream.generate(()->new Random().next(10)).limt(10).forEach(System.out::println)
- 打印随机数前10个
- 数组
-
流是中间操作?(有状态)
- filter
- map
- flatMap
- Peek
- Distint
- Sort
- Limit
-
流的终止操作?(无状态)
- ForEach
- Collect
- Reduce
- Min/Max
- Count
- FindFirst/FindAny
- AnyMatch/allMatch/noneMatch
反应式系统的特质
- 即时响应性
- 只要有可能,系统就会及时地做出响应。即时响应性是可用性和实用性的基石。
- 回弹性
- 在系统出现失败时依然保持即时响应性。回弹性 通过复制、遏制、隔离以及委托来实现的。失败的扩散被遏制在来每个组件内部。与其他组件相互隔离。从而确保系统某部分的失败不会危及整个系统。并能独立恢复。
- 弹性
- 系统在不断变化的工作负载之下依然保持即时响应性。反应式系统可以对输入的速率变化做出反应,比如通过增加或者减少被分配用于服务这些输入的负载资源。意味着设计上并没有争用点和中央瓶颈,得以进行组件的分片或者复制。
- 消息驱动
- 反应式系统依赖异步的消息传递.从而实现背压。
Reactive Stream Reactor Webflux
-
Reactive Stream 是什么?
- Reactive Streams是一套规范,它为非阻塞带背压的异步流处理提供了一套标准。这套API主要提供了4个接口。它针对不同的开发语言都提供了API。
-
Reactive Stream 标准接口
package org.reactivestreams; public interface Publisher<T> { public void subscribe(Subscriber<? super T> s); }package org.reactivestreams; public interface Subscriber<T> { public void onSubscribe(Subscription s); public void onNext(T t); public void onError(Throwable t); public void onComplete(); }package org.reactivestreams; public interface Subscription { public void request(long n); public void cancel(); }package org.reactivestreams; public interface Processor<T, R> extends Subscriber<T>, Publisher<R> { } -
JDK9 内置接口等价Reactive Stream 标准接口
java.util.concurrent.Flow.Processor<T,R> java.util.concurrent.Flow.Publisher<T> java.util.concurrent.Flow.Subscriber<T> java.util.concurrent.Flow.Subscription -
参考链接
http://reactivex.io/
https://github.com/ReactiveX/RxJava -
整体流程
sequenceDiagram
participant Subscriber
participant Publisher
participant Subscription
Subscriber ->> Publisher: subscribe(subscriber) // Subscriber 订阅 Publisher
activate Publisher
Publisher ->> Publisher: 创建 Subscription
Publisher ->> Subscriber: onSubscribe(subscription) // 发布 Subscription 对象
deactivate Publisher
activate Subscriber
Subscriber ->> Subscriber: 保存 Subscription
Subscriber ->> Subscription: request(n) // 请求 n 个数据项
deactivate Subscriber
activate Subscription
Subscription ->> Publisher: 请求数据
deactivate Subscription
activate Publisher
loop 发送数据
Publisher ->> Subscriber: onNext(data) // 发送数据项
end
deactivate Publisher
alt 数据流完成
Publisher ->> Subscriber: onComplete() // 通知完成
else 数据流发生错误
Publisher ->> Subscriber: onError(error) // 通知错误
end
opt 取消订阅
Subscriber ->> Subscription: cancel() // 取消订阅
activate Subscription
Subscription ->> Publisher: 取消订阅
deactivate Subscription
end
Project Reactor
-
反应式编程(Reactive Programming)
- 一种异步编程范式,关注于数据流和变化的传播。
- 核心思想是:将数据看作流,并定义对这些流的转换和处理。
- 利用数据流的传递和变化,自动地将变化传播到相关组件,从而实现响应式的用户界面和数据处理。
- 关键原则:
- 异步和非阻塞: 避免阻塞线程,充分利用系统资源。
- 背压 (Backpressure): 能够处理生产速度超过消费速度的情况,避免系统过载。
- 数据流转换: 提供丰富的操作符来转换和组合数据流。
-
响应式流(Reactive Streams)
一套用于异步处理背压数据流的标准。- Project Reactor 实现了 Reactive Streams 规范。
- Reactive Streams 定义了四个核心接口:
- Publisher: 发布者,产生数据流。
- Subscriber: 订阅者,消费数据流。
- Subscription: 连接 Publisher 和 Subscriber 的接口,用于请求数据和取消订阅。
- Processor: 既是 Publisher 又是 Subscriber,用于转换和处理数据流。
-
Reactor核心组件
- Flux: 表示一个包含 0 到 N 个元素的异步序列。 类似于 Java Stream,但用于处理异步数据流。 可以发出零、一个或多个元素,并且可以正常完成或抛出错误。
- Mono: 表示一个包含 0 到 1 个元素的异步序列。 用于处理可能存在也可能不存在的单个值。 通常用于表示异步操作的结果(例如,从数据库读取单个记录)。
- Scheduler: 调度器,用于控制任务的执行线程。 Reactor 提供了多种 Scheduler 实现,例如 Schedulers.immediate() (立即执行), Schedulers.single() (单线程), Schedulers.elastic() (弹性线程池), Schedulers.parallel() (并行线程池) 等。
- 操作符 (Operators): Reactor 提供了大量的操作符,用于对 Flux 和 Mono 进行转换、过滤、组合等操作。 例如:map, flatMap, filter, zip, reduce 等。

浙公网安备 33010602011771号