Reactor 2.0.0.RC1 版本现已发布,原生支持 Reactive Streams!

版本发布 | Jon Brisbin | 2015 年 2 月 18 日 | ...

Reactor 团队很高兴地宣布发布 2.0.0.RC1 版本,该版本现已在 spring.io Maven 仓库 以及 Maven central 中提供。2.0 版本是 Reactor 1.1 的一次 #uberupdate(重大更新),包含几个新组件,并对诸如 Stream 等重要类进行了全面重写,Stream 现在实现了 Reactive Streams 标准

请注意,Reactor 2.0 的 Maven 坐标已从 Reactor 1.x 的坐标更改。新坐标的 group ID 全部为 io.projectreactor,而不是之前的 org.projectreactor。一个 Gradle 项目的依赖块示例可能如下所示:

ext {
  reactorVersion = '2.0.0.RC1'
}

repositories {
  maven { url 'http://repo.spring.io/libs-milestone' }
  mavenCentral()
}

compile "io.projectreactor:reactor-core:$reactorVersion",
    "io.projectreactor:reactor-net:$reactorVersion",
    "io.projectreactor.spring:reactor-spring-context:$reactorVersion"

什么是 Reactor?

如果您对 Reactor 完全陌生,可能需要先访问焕然一新的新网站 http://projectreactor.io,在了解它之后,本文的一些内容才会更容易理解。

更新日志(TL;DR,太长不看版)

除了 2.0.0.M1 版本中宣布的更改之外,以下是相对于 1.1 版本的一些重要更改的简要列表:

  • Stream 已重写以实现 Reactive Streams 标准,速度比之前版本快 5-10 倍,并且开销大大降低。
  • 从 Reactor 1.x 代码升级并不困难,只需对现有代码进行少量更改即可适应 Stream 的新签名以及将 Reactor 重命名为 EventBus。关于此过渡的文档正在编写中。
  • Reactor 的 Stream API 源自 Reactive Extensions,并沿用了其许多命名约定。通过利用通用的词汇和行为,可以轻松将 Rx.NET 和 RxJava 示例转换为 Reactor。
  • Reactor 的 API 已围绕静态辅助方法和工厂进行了统一,以使嵌入尽可能容易。
  • TCP 支持全面增强:Reactive Streams 背压、HTTP 服务器和客户端、Stream 集成、DSL 辅助方法。
  • 一个新网站,包含正在构建的正式参考手册、更多示例和更多 javadoc。
  • 来自不仅仅是核心项目提交者的社区贡献。

Reactive Streams 真是太棒了

如果我们只能谈论一个变化,那就是对 Reactive Streams 的原生和基础支持。Reactive Streams 对 Reactor 的重要性怎么强调都不为过。流处理是新的 热点,Reactor 从项目伊始就拥抱了这一点。然而,Reactive Streams 的加入及其背压支持的传播,使得在真实或接近实时的情况下处理大量数据对您的云应用程序变得更加容易。现在,诸如负载下的 stop-readbatch flushadaptive batch 等模式都可以直接使用。

Reactor Stream 中的每个步骤都是一个 Reactive Streams 组件,它根据当前资源限制下的处理速率正确地传播需求和背压。使用 Reactive Streams,Reactor 2.0 可以创建自动调整资源使用的处理流。由于 Reactive Streams 背压向上游传递的方式,您可以影响新项目被拉入系统的速率。这意味着如果当前处理正在使用所有可用资源,下游的慢速组件可以一直向源头施压,以减慢输入速率。

Pool<Connection> pool;
Stream<Message> input;

input.capacity(1)
     .batchConsume(msg -> {
       pool.getConnection().merge(msg);
     }, requestMore -> Math.max(pool.getSize() - pool.getActive(), 1));

在上面的代码片段中,我们根据连接池中可用连接的数量来调整要处理的项目数量。作为 batchConsume 方法的第一个参数传入的 Consumer 将根据作为第二个参数传入的 Function 返回的 requestMore 值来调用。在本例中,我们将预取数量等于连接池中空闲连接数的或仅预取单个消息(如果所有连接都处于活动状态)的消息(在这种情况下,我们将依赖于连接池的背压)。

如果我们想确保我们的流不会占用过多资源,我们还可以更改容量算法,使其返回一个小于可用连接数的值,这将为应用程序中的其他组件保留一些连接。

Reactor 现在支持 Android

从 Reactor 2.0.0.RC1 开始,只需排除 gs-collections 库即可将 Reactor 包含在您的 Android 应用程序中,否则该库的大小会迫使您绕一些弯路。我们为 EventBus 实现了一个不使用 gs-collectionsSimpleCachingRegistry。未来的改进可能包括一个专用的 UI 事件循环 Dispatcher,以确保您的事件处理程序在正确的线程上运行。

我们非常期待看到 Reactor 如何促进 Android 设备上的响应式应用程序,以及这与 Reactor 在服务器端极高的吞吐量和低延迟能力如何关联。如果您正在 Android 上使用 Reactor,并且有任何可以改进体验的建议,请告知我们。

HTTP、改进的 TCP 和 ZeroMQ 支持

RC1 基于 Reactor 对 Netty 4 的使用引入了新的 HTTP 支持。它尚未全面,但为构建(和访问)基于 REST 的非阻塞微服务和纳服务提供了一些辅助方法和有用的抽象。我目前还不会尝试用它构建生产服务,因为在 GA 版本发布之前还需要进行一些改进。您可以使用 Reactor 嵌入微服务,而无需直接调用 Netty API。

以下代码创建一个基于 Netty 的嵌入式 HTTP 服务器,该服务器带有路径参数,并将任务分派到共享的 RingBufferDispatcher 上。

HttpServer<String, String> server = NetStreams.httpServer(
  spec -> spec.listen(3000)
              .codec(StandardCodecs.STRING_CODEC)
              .dispatcher(Environment.sharedDispatcher())
);

server.get("/echo/{greeting}", ch -> {
  String greeting = ch.param("greeting") + " World!";

  ch.transfer(Transfer.NON_CHUNKED)
    .responseHeader("Content-Length", "" + greeting.length())
    .log("server");

  return Streams.just(greeting);
});

server.start();

我们还更新了 TCP 和 ZeroMQ 支持,以更好地利用我们对 Stream 所做的重要更改。最重要的是,TCP 服务器和客户端利用 Reactive Streams 背压支持来实现诸如“stop-read”之类的模式,以防止服务器在下游处理资源可用之前从客户端读取过多数据而导致溢出。

通往 GA(正式发布)版本之路

在发布 Reactor 2.0 GA 版本之前,我们将至少再发布一个 RC 版本。在复杂的 fork/join 分发方面,我们还需要进行一些调整才能对它的可预测性感到满意。由于第一个版本的功能集相当简单,我们可能会对 HTTP 支持进行一些补充。在某些边缘情况下,我们可能还会遇到一些其他 bug。

我们对这个候选版本感到非常满意,并鼓励您试用它。如果您正在进行新的开发,我们强烈建议您在 Reactor 2.0 的 Reactive Streams 基础上构建,而不是使用功能较弱的 1.1 版本(非 Reactive Streams 版本)。如果您正在升级现有的 Reactor 代码,过程实际上非常简单。在几乎所有情况下,您的代码都将得到极大的简化。

获取支持

如果您在升级代码时遇到问题,或者对如何使用 Reactor 解决您的快速数据问题有一般性疑问,请随时在 Reactor Framework Google Group 上提问。

我们也欢迎社区通过 GitHub 上的拉取请求做出贡献。

您可能也有兴趣了解,Reactive Streams 项目正在考虑以新的 java.util.concurrent.Flow 类及其相应的内部类的形式纳入 JDK 9。关于此主题的讨论正在由纽约州立大学奥斯威戈分校的 Doug Lea 教授管理的 JSR-166 concurrency-interest 邮件列表进行。

获取代码

Reactor 采用 Apache 2.0 许可证,项目通过 GitHub 管理

获取 Spring 资讯

订阅 Spring 资讯,保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速发展。

了解更多

获取支持

Tanzu Spring 通过一个简单的订阅即可为 OpenJDK™、Spring 和 Apache Tomcat® 提供支持和二进制文件。

了解更多

近期活动

查看 Spring 社区的所有近期活动。

查看全部