Project Reactor 是基于 Reactive Streams 的Java响应式框架,核心为Mono(0/1元素)和Flux(0-N元素),支持背压、惰性操作符链、线程调度(如boundedElastic/parallel)。

Project Reactor 是 Java 生态中主流的响应式编程框架,基于 Reactive Streams 规范实现,专为构建高吞吐、低延迟、非阻塞的异步应用而设计。它不是对传统编程的替代,而是针对 I/O 密集型、事件驱动或流式数据处理场景的有力补充。
Reactor 的核心类型:Mono 与 Flux
Reactor 提供两个核心发布者(Publisher)类型,对应不同数据流形态:
- Mono:表示最多发射 0 或 1 个元素的异步序列,适合封装单结果操作(如 findById、save 返回单对象、HTTP GET 单资源);
- Flux:表示 0 到 N 个元素的异步序列,支持无限流(需配合背压控制),适用于集合处理、事件流、WebSocket 消息等场景。
二者都实现了 Publisher 接口,可被订阅,也提供丰富的操作符(operator)进行链式转换、组合与错误处理。
响应式流的关键机制:背压(Backpressure)
背压是 Reactive Streams 的核心约定,用于协调生产者与消费者之间的数据速率。当下游处理能力不足时,上游可暂缓发送或降级策略,避免内存溢出。
- Flux 支持多种背压策略,如
onBackpressureBuffer()、onBackpressureDrop()、limitRate(n); - Mono 天然不涉及背压(最多一个元素),但其组合到 Flux 流中时会遵循整体流的背压规则;
- 实际使用中,WebFlux 默认通过 Netty 或 Undertow 的非阻塞通道自动传播背压,开发者通常只需在数据源(如数据库驱动、消息队列客户端)启用响应式支持即可生效。
操作符链与惰性执行(Lazy Evaluation)
Reactor 的操作符(如 map、filter、flatMap、retry)不会立即触发执行,而是在调用 subscribe() 或终端操作(如 block()、toFuture())时才真正组装并启动数据流。
- 这意味着声明式链是轻量的,便于复用和测试;
- 避免在链中做副作用操作(如打印日志、修改外部状态),除非使用
doOnNext、doOnError等“钩子”操作符; - 调试时可用
log()插入链中,输出生命周期事件(onSubscribe、onNext、onComplete 等)。
线程调度与 Schedulers
Reactor 不绑定特定线程模型,但提供 Schedulers 工具类统一管理执行上下文:
-
Schedulers.boundedElastic():适用于阻塞 I/O(如 JDBC、文件读写),带线程池与队列保护; -
Schedulers.parallel():适用于 CPU 密集型任务,固定大小线程池(通常为 CPU 核心数); -
Schedulers.immediate():同步执行,常用于测试; - 使用
publishOn()切换下游操作符执行的线程;subscribeOn()指定整个流的起始执行上下文(仅首次生效)。
注意:WebFlux 应用中,Web 层默认运行在事件循环线程(如 Netty EventLoop),应避免在其中执行阻塞操作,必要时显式切换到 boundedElastic。











