1.5 Reactor与RxJava的对比
关于响应式编程,我写的《Java编程方法论:响应式RxJava与代码设计实战》一书已经出版,那么Reactor与RxJava又有什么区别呢?首先我要明确地告诉你,如果你使用的是Java 8+,那么推荐使用Reactor 3,而如果你使用的还是Java 6+或函数需要做异常检查,那么推荐使用RxJava 2。
下面来看图1-1。
从图1-1可以看到,RxJava 2和Reactor共用了一套接口API标准Reactive Streams Commons,这也说明它们的最终目的是一致的,而且API具有通用性,这样也降低了学习成本。
下面再来回顾一下RxJava。迄今为止,RxJava发行版主要分三大版本RxJava 3、RxJava 2和RxJava 1。与RxJava 1不同,RxJava 3、RxJava 2直接通过新添加的Flowable类型来实现Publisher的接口定义(RxJava 3与RxJava 2并没有太多区别,故这里只介绍RxJava 2)。同时,RxJava 2依然保留了RxJava 1中的Observable、Completable和Single,并引入了支持Optional的Single升级版——Maybe类型(这点在《Java编程方法论:响应式RxJava与代码设计实战》一书中并没有提及,此处只是说明一下,并不会深究)。RxJava 1中的Observable不支持RxJava 2中的背压机制,背压机制是Flowable的专有功能,不过Observable内部提供了可转换API。需要注意的是,Observable实现的是RxJava 2中自定义的ObservableSource接口。
图1-1
在Reactor中,可以发现Mono和Flux两种类型都实现了Publisher接口,同时两者皆实现了背压机制。Flux可以对标RxJava 2中的Flowable类型,而Mono可以被理解为RxJava 2中对Single的背压加强版。后续,我们会进行更深入的讲解。
同样,下面再来了解一下Reactor与RxJava的不同之处。
◎ 为了兼容Java 1.6+,RxJava不得不自行定义了一些函数式接口,可以参考io.reactivex.functions下的接口定义。而Reactor 3则是基于JDK中提供的java.util.function来设计实现的。
◎ 可以很轻松地从java.util.stream.Stream转换为Flux,也可以很轻松地由后者转换为前者。
◎ 同样,可以很轻松地实现CompletableFuture与Mono之间的互相转换,也可以轻松而安全地基于Optional类型的元素创建Mono。
◎ 从图1-1中还可以看到,Reactor 3可以更好地服务于Spring Framework 5,也更适应最新版本的JDK。
最后,简单介绍一下图1-1中的几个部分。
◎ Core:是我们主要研究的库,是Reactor的核心实现库。其作用与RxJava 2的核心实现的作用是一样的,本书主要介绍reactor-core模块。
◎ IPC:可以认为它是针对encode、decode、send(unicast、multicast或request/response)及服务连接而设计的支持背压的组件。IPC支持Kafka、Netty及Aeron。
◎ Addons:其中包括reactor-adapter、reactor-logback和reactor-extra。reactor-adapter可以说是连接RxJava 1/2中Observable、Completable、Flowable、Single、Maybe、Scheduler的桥梁,可以方便地与Reactor 3进行转换操作。同样,这个库对于Swing/SWT Scheduler、Akka Scheduler也做了针对性适配。reactor-logback用于支持Reactor Core异步处理Logback方面的功能。reactor-extra为数字类型的Flux源提供了很多数学运算的操作。
◎ Reactive Streams Commons:是RxJava 2和Reactor共用的一套接口API标准。