领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多我代表Reactor团队,很荣幸地宣布最新的Reactor里程碑版本Californium-M1
??
团队一直在忙于开发Californium
,这是Reactor 3的第三个主要版本。我们现在准备好听取您对一些特定问题的反馈,并且我们还有许多增强功能和错误修复等待您的体验。
对于它的第三个发布列车,我们继续沿用元素周期表上按字母顺序递增的元素名称的主题。锔是一种首先在加利福尼亚州合成的元素。
此里程碑版本的物料清单包含:
reactor-core
3.2.0.M3
reactor-extra
3.2.0.M1
(有一些API对齐更改)reactor-netty
0.8.0.M1
今年年初 (M1),有一个reactor-core
的早期预览版本,它只关注“错误模式继续”功能,并且核心在6月份还有一个脱离发布列车的里程碑版本 (M2)。这篇博客文章除了介绍全新的M3中的更改之外,还介绍了后者的更改。
这里最重量级的部分是reactor-netty
。期待一篇更完整的博客文章,详细介绍API更改和新功能背后的原因,其中包括:
团队引入了一个大型的API重构,在构建客户端和服务器时提供更清晰的指导,避免了在0.7.x版本中容易出现的难以预测的配置错误。
新的API也更清晰地概述了生命周期。
是的,**HTTP2支持** ?? 目前它主要是在透明地升级到HTTP2,但我们正在努力在不久的将来将HTTP2单个流作为一等公民添加。
总的来说,与之前的Bismuth版本相比,M2和M3带来了超过70个更改。
reactor-core中的API更改比reactor-netty中的少,更新注意事项主要与里程碑版本本身之间的差异有关。有关更多详细信息,请参阅M2和M3的“更新注意事项”部分。
我们最需要您对以下功能提供反馈:
已添加Micrometer和.metrics()
支持(#1183,#1123)。只有当Micrometer
在类路径上时,新的.metrics()
操作符才会执行某些操作。
它记录关于onNext
计时、订阅到完成计时、信号计数等的指标——所有这些都是从直接上游操作符产生的信号的角度来看的。
它在M2中引入,但在M3中得到了改进,以及一些标签名称的(破坏性)更改(#1245)。
请注意,一个重要的目标是避免在公共Reactor API中公开Micrometer的内容。我们不想强制依赖Micrometer,并且我们努力将其使用限制在只有在我们检测到它在类路径上时才会加载的内部类中。
**接下来:**在GA之前,还应该对
Schedulers
(或者更确切地说是支持一些Schedulers
的ExecutorServices
)提供基本的检测支持。我们还在研究一种方法来为Reactor全局选择一个特定的MeterRegistry
,同样无需公开引用MeterRegistry
接口的公共API。
我们添加了一个预配置的retryWhen
替代方案,该方案具有指数退避和抖动 (retryBackoff()
)。请参见 #1122。
此重试版本反映了我们认为的行业最佳实践。它是过于简单的retry(n)
、复杂的retryWhen(Function)
和reactor-addons
中更可配置的RetryFunction
之间的一个很好的折中方案。
为了帮助您构建响应式事务块,我们添加了usingWhen
。与using
一样,它包装一个资源,从中生成一个Flux
,并确保在Flux终止时正确清理资源。
主要区别在于:
Publisher
异步提供。Function<Resource, Publisher>
),并且只延迟终端信号的传播,而不是onNext信号。这在M2中引入,但在M3中略有更改,以修复Context
传播并支持取消Publisher<Resource>
。通过在Resource
发出之前取消此操作符返回的主Flux<T>
,您的取消指令将传播到Publisher<Resource>
。
onDiscard
钩子这个全局钩子采用Consumer<Object>
的形式,旨在作为处理需要特殊清理的堆外对象的进阶用户的最后一个缺失部分。
通常,Netty的ByteBuf
或Spring 5的DataBuffer
属于此类别:它们是池化的、堆外的,并且需要一个release()
调用,除非它们不再使用,否则可能会发生内存泄漏。
此类元素可能在响应式序列之间出现裂缝,并且在三种主要情况下永远不会到达用户代码:
onComplete
之后发出ByteBuf
)。filter
)。情况(1)已由onNextDropped
钩子涵盖,但情况(3)肯定没有。情况(2)(过滤语义)有点介于两者之间,例如,可以在过滤Predicate
内部进行清理。但这很麻烦,而且很容易被遗忘。
因此,我们向我们的 `Hooks` 库中添加了 `onDiscard` 来处理 (2) 和 (3)。需要注意的是,与“错误继续”功能不同,目前尚无公共 API 可用于在特定的 `Flux` 实例上设置此 hook。可以使用 `Context` 实现一个不受支持的变通方案,官方 API 可能会在 GA 版本或后续的维护版本中出现。
`onDiscard` hook 具有以下**特性和要求**
顺便一提,`errorStrategyContinue()` **在 M3 版本中已重命名为 `onErrorContinue()`**。
最后,`reactor-extra` 在重试/重复实用程序方面进行了一些较小的 API 更改。它与 `core` 运算符保持一致,使用相同的默认值和 `Long` 而不是 `Integer` 索引。
`reactor-core` 的下一步是重新设计 `Processor` 对象的公开方式。当前的 `FluxProcessor
此外,`FluxProcessor#sink()` 和相关的 `FluxSink` 非常容易被误用,尤其是在想要将 `Processor` 订阅到 `Publisher` 源并通过 `sink()` 手动向其推送数据时,目前并不真正支持这种方式。`sink()` 应该只调用一次,并且返回的 `FluxSink
因此,我们正在考虑创建一个 `Processor
`MonoProcessor` 可能也会遵循这些步骤,成为一个(更简单的)接口,具体的实现将重命名为 `MonoNextProcessor`。我们还在考虑提供一个独立的 `MonoSink` 实现,用户可以直接操作它,而无需使用 `Mono.create()`。
酷的人不会等待 GA 版本发布!快去试用这个闪亮的里程碑版本吧,并且一如既往地欢迎反馈!:)
祝您反应式编程愉快!