(一)响应式编程基础概念

响应式编程基础概念

JDK常用函数类型示例

  1. Supplier

    • 说明: 没有输入 只有1个输出.
  2. Consumer

    • 说明: 只有1个输入 没有输出.
  3. Function<T,R>

    • 说明: 输入是T类型 输出是R类型
  4. UnaryOperator<T> extends Function<T,T>

    • 说明:输入和输出都是T
  5. BiFunction<T,U,R>

    • 说明: 输入T和U返回R

JDK Stream 编程

  1. 什么是Stream?

    • 流中元素类型可以是对象,基本数据类型(int,double,long)
  2. 流是怎么创建的?

    1. 数组 Arrays.stram()
    2. 集合 Arrays.asList()
    3. Stream.Of(arr/list/...)
    4. 迭代器 打印1-10元素
      1. Stream.iterate(1,i->i+1).limit(10).forEach(System.out::println)
    5. generate
      1. 打印随机数前10个
        Stream.generate(()->new Random().next(10)).limt(10).forEach(System.out::println)
  3. 流是中间操作?(有状态)

    1. filter
    2. map
    3. flatMap
    4. Peek
    5. Distint
    6. Sort
    7. Limit
  4. 流的终止操作?(无状态)

    1. ForEach
    2. Collect
    3. Reduce
    4. Min/Max
    5. Count
    6. FindFirst/FindAny
    7. AnyMatch/allMatch/noneMatch

反应式系统的特质

  1. 即时响应性
    • 只要有可能,系统就会及时地做出响应。即时响应性是可用性和实用性的基石。
  2. 回弹性
    • 在系统出现失败时依然保持即时响应性。回弹性 通过复制、遏制、隔离以及委托来实现的。失败的扩散被遏制在来每个组件内部。与其他组件相互隔离。从而确保系统某部分的失败不会危及整个系统。并能独立恢复。
  3. 弹性
    • 系统在不断变化的工作负载之下依然保持即时响应性。反应式系统可以对输入的速率变化做出反应,比如通过增加或者减少被分配用于服务这些输入的负载资源。意味着设计上并没有争用点和中央瓶颈,得以进行组件的分片或者复制。
  4. 消息驱动
    • 反应式系统依赖异步的消息传递.从而实现背压。

Reactive Stream Reactor Webflux

  1. Reactive Stream 是什么?

    • Reactive Streams是一套规范,它为非阻塞带背压的异步流处理提供了一套标准。这套API主要提供了4个接口。它针对不同的开发语言都提供了API。
  2. 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> {
    }
    
  3. 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
    
  4. 参考链接
    http://reactivex.io/
    https://github.com/ReactiveX/RxJava

  5. 整体流程

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

  1. 反应式编程(Reactive Programming)

    • 一种异步编程范式,关注于数据流和变化的传播。
    • 核心思想是:将数据看作流,并定义对这些流的转换和处理。
    • 利用数据流的传递和变化,自动地将变化传播到相关组件,从而实现响应式的用户界面和数据处理。
    • 关键原则:
    • 异步和非阻塞: 避免阻塞线程,充分利用系统资源。
    • 背压 (Backpressure): 能够处理生产速度超过消费速度的情况,避免系统过载。
    • 数据流转换: 提供丰富的操作符来转换和组合数据流。
  2. 响应式流(Reactive Streams)
    一套用于异步处理背压数据流的标准。

    • Project Reactor 实现了 Reactive Streams 规范。
    • Reactive Streams 定义了四个核心接口:
    • Publisher: 发布者,产生数据流。
    • Subscriber: 订阅者,消费数据流。
    • Subscription: 连接 Publisher 和 Subscriber 的接口,用于请求数据和取消订阅。
    • Processor: 既是 Publisher 又是 Subscriber,用于转换和处理数据流。
  3. 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 等。
posted @ 2025-07-25 16:13  贺艳峰  阅读(12)  评论(0)    收藏  举报