10.2 Reactor
10.2 Reactor
响应式编程需要我们从与命令式编程完全不同的角度去思考。响应式编程是通过直接建立一个用于数据流通的管道,而不是描述一系列需要进行的步骤。作为数据流通的管道,它可以被改变或以某种方式被使用。
例如,假设你想到利用一个人的名字,把它的所有字母变为大写,然后用它来创建一个问候语,最后将它打印出来。在命令式编程模型中,代码会是这个样子:
String name = "Craig";
String capitalName = name.toUpperCase();
String greeting = "Hello, " + capitalName + "!";
System.out.println(greeting);
在命令式编程中,每一行为一步,一步接着一步,同时绝对是在同一个线程中。每一步都会阻塞直到完成才能进行下一步动作。
相反,函数式的响应式代码可以以下面这种方式达到目的:
Mono.just("Craig")
.map(n -> n.toUpperCase())
.map(cn -> "Hello, " + cn + "!")
.subscribe(System.out::println);
不要太担心这个例子中的细节;我们很快将讨论所有关于
例子中的
Reactor 与RxJava 如果你已经熟悉
RxJava 或ReactiveX ,你可能会认为Mono 和Flux 听起来很像Observable 和Single 。事实上,它们在语义上近似相等,甚至提供许多相同的操作。尽管我们在本书中重点讨论
Reactor ,但可以在Reactor 和RxJava 类型之间进行转换。此外,你将在下面的章节中看到Spring 还可以使用RxJava 的类型。
在前面的例子中实际上有三个
10.2.1 图解响应式流
响应式流通常使用弹珠图(Marble Diagram)进行绘制。弹珠图最简单的形式就是,在最上面画出数据流经
图
在
图
图
10.2.2 添加Reactor 依赖
让我们开始使用
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
我假定你要向
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-bom</artifactId>
<version>Bismuth-RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
现在,