Reactor是什么

# Reactor简介

Reactor是JVM的完全非阻塞式反应式编程基础,具有高效的需求管理(以管理“背压”的形式)。 它直接与Java 8功能API集成在一起,特别是CompletableFuture,Stream和Duration。 它提供了可组合的异步序列API,例如Flux(用于[N]个元素)和Mono(用于[0 | 1]个元素),并且广泛实现了Reactive Streams规范。

Reactor还支持与Reactor-Netty项目的非阻塞进程间通信。 适用于微服务架构,Reactor Netty为HTTP(包括Websockets),TCP和UDP提供了支持背压的网络引擎。,并且完全支持反应式编码和解码。

# 先决条件

Reactor Core在Java 8及更高版本上运行

它对org.reactivestreams:reactive-streams:1.0.3具有传递依赖。

提示

Android支持:

  • Reactor 3并未正式支持Android或将其定位为Android(如果强烈要求使用RxJava 2,请考虑使用RxJava 2)。但是,它在Android SDK 26(Android O)及更高版本上应该可以正常工作。

  • 启用反欺骗功能后,它可能会在Android SDK 21(Android 5.0)及更高版本上正常工作。 参见https://developer.android.com/studio/write/java8-support#library-desugaring

# 反应式编程简介

Reactor是反应式编程范例的实现,可以总结如下:

反应式编程是一种异步编程范式,它涉及数据流和变化的传播。这意味着可以通过所采用的编程语言轻松表达静态(例如数组)或动态(例如事件发射器)数据流。

— https://en.wikipedia.org/wiki/Reactive_programming

作为响应式编程方向的第一步,Microsoft在.NET生态系统中创建了响应式扩展(Rx)库。然后RxJava在JVM上实现了反应式编程。随着时间的流逝,通过Reactive Streams的努力,出现了Java的标准化,该规范定义了JVM上的响应库的一组接口和交互规则。它的接口已集成到Flow该类下的Java 9中。

反应式编程范例通常以面向对象的语言表示,作为Observer设计模式的扩展。您还可 以将主要的反应流模式与熟悉的Iterator设计模式进行比较,因为所有这些库中的Iterable- Iterator对都有双重性 。一个主要的区别是,虽然Iterator是基于pull的,但反应式流是基于push的。

使用迭代器是命令式编程模式,即使访问值的方法仅由负责Iterable。实际上,由开发人员决定何时选择next()序列中的项目。在反应性物流中,上述对的等价物为Publisher-Subscriber。但是,当 Publisher新可用值出现时,正是通知订户,而这一推送方面是做出反应的关键。同样,应用于推入值的操作以声明方式而不是命令方式表示:程序员表示计算的逻辑,而不是描述其确切的控制流程。

除了推送值之外,还以明确定义的方式涵盖了错误处理和完成方面。A Publisher可以Subscriber(通过调用onNext)将新值推入其值,但也可以通过(调用onError)或完成(通过调用onComplete)发出错误信号。错误和完成都会终止序列。可以总结如下:

onNext x 0..N [onError | onComplete]
1

这种方法非常灵活。该模式支持没有值,一个值或n个值(包括无限个值序列,例如时钟的连续滴答声)用例。

# 从命令式编程到反应式编程

反应性库(例如Reactor)旨在解决JVM上“经典”异步方法的这些缺点,同时还着重于一些其他方面:

  • 可组合性代码可读性
  • 将数据视作一个流,并提供丰富的算子来操作流
  • 在**订阅(subscriber)**之前不会实际做任何事情
  • 反压 或者说 消费者通知生产者流速过高的能力
  • 并发无关(concurrency-agnostic)的高阶(high level)抽象,适用性强(high value)(译注:并发无关是指这种抽象对于并发非并发的场景都适用)

# 获取 Reactor

# Maven 管理依赖包

Maven 原生支持 BOM 模型概念。首先,在你的 pom.xml 文件添加如下代码片段来引入 BOM:

<dependencyManagement> 
    <dependencies>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-bom</artifactId>
            <version>Bismuth-RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
1
2
3
4
5
6
7
8
9
10
11

备注:注意其中的 dependencyManagement 标签,添加到 dependencies 一节中。

如果顶部标签(dependencyManagement)已经存在,则只添加上面该标签的内部内容。接下来,将依赖包添加到项目中,和一般依赖包一样,不过没有 <version>,如下所示:

<dependencies>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-core</artifactId> 
    </dependency>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-test</artifactId> 
        <scope>test</scope>
    </dependency>
</dependencies>
1
2
3
4
5
6
7
8
9
10
11

# Gradle 管理依赖包

Gradle 核心并不支持 Maven BOM,不过可以借助 Spring 的 gradle-dependency-management 插件。首先,应用插件,如下所示:

plugins {
    id "io.spring.dependency-management" version "1.0.6.RELEASE"
}
1
2
3

然后使用它来引入 BOM,如下所示:

dependencyManagement {
     imports {
          mavenBom "io.projectreactor:reactor-bom:Bismuth-RELEASE"
     }
}
1
2
3
4
5

最后将依赖添加到项目中,无需指定版本号,如下所示:

dependencies {
     compile 'io.projectreactor:reactor-core' 
}
1
2
3
上次更新: 2020/09/09, 8:09:00
最近更新
01
RabbitMQ简介
10-27
02
聊聊Java多态
10-21
03
JVM垃圾回收器
10-16
更多文章>