Java Spring WebFlux与RxJava

时间:2019-06-05 13:14:54

标签: rx-java reactive-programming spring-webflux project-reactor

我开始学习Java的反应式编程。整个反应式范式对我来说都是新的。

在学习过程中,我遇到了几个术语/库,例如Spring WebFlux,projectreactor和RxJava。我希望有人能解释这些差异是什么,以及您在项目中使用的是哪个,以及您为何选择此选项。

我读到Spring WebFlux实际上在内部使用了projectreactor的Flux / Mono。这简化了Spring Webflux相对于RxJava的优缺点?

3 个答案:

答案 0 :(得分:2)

反应式编程是一种编程范例,但我不会将其称为全新的。实际上已经存在了一段时间。就像面向对象的编程,函数式编程或过程式编程一样,反应式编程只是另一种编程范例。

范式由Reactive Manifesto

定义 另一方面,

反应流是一种规范。

对于Java程序员,反应式流是一种API。它是Kaazing,Netflix,Pivotal,Red Hat,Twitter,Typesafe和许多其他公司的工程师之间合作的产物。反应性流非常类似于JPA或JDBC。两者都是API规范。

反应流API 仅由4个高级接口组成。

  1. 发布者: 发布者是可能有无限数量的序列元素的提供者,并根据从其订阅者那里收到的需求来发布它们。
  2. 订户: 将订户实例传递到Publisher.subscribe(Subscriber)后,将收到一次对Subscriber.onSubscribe(Subscription)的呼叫。
  3. 订阅: 订阅代表订阅者订阅发布者的一对一生命周期。
  4. 处理器 处理器代表一个处理阶段-既是订阅者又是发布者,并且服从两者的合同。

这些概念在不同的级别和区域具有不同的表现形式。例如。一个Java开发人员可以考虑如何在应用程序级别进行编程,数据库工程师可以考虑数据库如何响应响应式API调用(例如,Mongo DB已实现了Reactive Streams驱动程序),网络程序员可以考虑如何响应式通话可以在网络一级生效。

遵循反应式流规范的一些基于JVM的框架是

  • Akka Streams框架
  • Ratpack
  • Vert.x
  • ReactiveX(RxJava 2.x和Reactor)
  • Java 1.9 Flow类(您会注意到Reactive Streams接口在Java 9中的Flow类下移动)

ReactiveX 是Observer模式,Iterator模式和函数式编程的最佳创意的结合。它扩展了观察者模式以支持数据和/或事件序列,并添加了运算符,使您可以声明性地将序列组合在一起,同时抽象化了对低级线程,同步,线程安全,并发数据结构和非阻止I / O。

RxJava 2.0和Reactor基于ReactiveX项目。 Spring WebFlux在内部使用Reactor。

答案 1 :(得分:0)

通常,基于JDK8-的RxJava支持项目和Project Reactor支持JDK 8+。但是对于初学者来说,您可以首先学习RxJava。从Project Reactor开始,您可以考虑它解决了RxJava中的缺陷,并且更适合于后端开发。 RxJava有太多问题,如果使用不当,可能会导致内存不足。 但是最后,如果您想很好地使用Spring 5.2+,则需要向RxJava-> Reactor-> NIO-> Netty-> Reactor netty学习。

答案 2 :(得分:0)

Spring WebFlux(project-reactor)和RxJava2 +都是reactive-streams的实现。

Spring正在使用project-reactor,因此它得到更多的支持,发布广告并具有更大的社区,所以我会同意的。