Java响应式编程 & Reactor Flux_Mono 完整体系手册(从零到生产SSE)
约 1978 字大约 7 分钟
2026-08-12
第一章:响应式编程核心思想(为什么出现)
1.1 传统阻塞编程痛点
同步 Servlet:一个请求占一个线程,线程池200条就是最大并发200
IO 阻塞浪费 CPU:网络等待、DB 等待时线程休眠,CPU 空转
长连接场景(SSE/WS)线程永久占用,无法高并发
1.2 响应式编程定义
响应式编程 = 异步 + 非阻塞 + 事件驱动 + 背压自适应
核心思想:不再主动轮询等待数据,数据来了自动回调处理,且消费者控制生产速度。
1.3 四大核心特性(Reactive Manifesto)
响应性:数据到达立刻处理
弹性:过载不崩、自动降速
容错:异常隔离、可恢复
异步数据流:所有业务都是流
第二章:Reactive Streams 官方规范(Java标准)
所有 Flux/Mono、WebFlux、RxJava 全部强制遵循该规范。
规范只定义 4 个顶层接口(最核心根基)。
2.1 Publisher<T> 发布者(生产者)
数据流源头,代表 0~N 个元素的异步序列。
public interface Publisher<T> {
void subscribe(Subscriber<? super T> s);
}Flux / Mono 直接实现该接口
调用 subscribe() 才会生产数据(冷流核心)
2.2 Subscriber<T> 订阅者(消费者)
public interface Subscriber<T> {
void onSubscribe(Subscription s);
void onNext(T t);
void onError(Throwable t);
void onComplete();
}四大信号全覆盖:
onSubscribe:订阅建立,拿到流量控制器
onNext:每一条数据
onError:异常、终止流
onComplete:正常结束、终止流
2.3 Subscription 订阅令牌(背压核心)
连接上下游、控制流速的唯一核心。
public interface Subscription {
void request(long n); // 我要 n 条数据(消费者控速)
void cancel(); // 取消订阅、断流、释放资源
}背压本质:消费者说了算,不是生产者乱发。
2.4 Processor<T,R> 处理器
同时是 Publisher + Subscriber,既可消费又可生产,用于桥接、转发、事件总线。
第三章:Reactor 核心实现(Flux / Mono)
3.1 继承关系(你要的接口实现)
Flux<T> implements Publisher<T>:0~N 个元素(流式、SSE、批量)Mono<T> implements Publisher<T>:0~1 个元素(单结果、接口、查询)
所有 WebFlux、WebClient、SpringAI 底层全部是标准 Publisher。
3.2 冷流 & 热流(彻底讲透)
冷流 Cold Publisher(Reactor 默认全部是冷流)
无订阅、无数据、无执行、无IO
每次订阅重新生产一次数据
WebClient、Flux.create、Flux.range 都是冷流
适配 HTTP 请求、单次调用、SSE 单次对话
热流 Hot Publisher
无论有没有订阅者,数据一直在产生
多用于事件总线、MQ、全局广播
典型:Processor、Flux.share()
3.3 背压完整分级
应用层:request(n) 按需拉取
队列层:publishOn / Sink 缓冲队列
Netty层:自动读开关启停
TCP内核层:滑动窗口限流
真正的全链路限流,不是业务代码手动 sleep。
第四章:Reactor 全量操作符分类(最全整理)
按用途分类,彻底告别混乱记忆。
4.1 创建操作符(造流)
just():固定元素创建
fromArray/fromIterable:集合转流
range():数字区间
empty():空流正常结束
error():直接异常流
create():手动发射器(你的SSE核心)
defer():订阅时才创建流(懒创建)
4.2 转换操作符(加工数据)
map:同步一对一转换
flatMap:一对多、异步、无序合并(最常用)
concatMap:有序拼接
filter:过滤
defaultIfEmpty:空流兜底
4.3 线程调度操作符(重中之重)
subscribeOn
作用:向上游生效
控制:源头初始化、阻塞逻辑、订阅启动线程
用途:隔离 DB、限流、同步阻塞初始化
publishOn
作用:向下游生效
控制:onNext、业务处理、回调线程
用途:保护 Netty IO 线程,剥离耗时业务
自带队列、自带背压、跨线程解耦
4.4 副作用钩子(你的SSE埋点全套)
纯监听、不修改数据流、不改变流程
doOnNext:每条数据到达
doOnComplete:正常结束
doOnError:异常结束
doFinally:万能收尾(成功/异常/取消 全部触发)
doOnSubscribe:订阅建立
doOnCancel:主动断开取消
4.5 异常处理操作符
onErrorReturn:异常返回默认值
onErrorResume:异常降级、返回新流
onErrorMap:异常包装转换
retry:重试
4.6 终止与收集操作符
block():禁止在WebFlux使用!阻塞线程
collectList:Flux转Mono<List>
then:只关注结束,不关注数据
第五章:四大调度器 Scheduler(线程池细则)
所有线程切换最终依赖这四种。
5.1 Schedulers.parallel()
CPU核心数线程
适合:CPU密集计算
禁止跑阻塞IO
5.2 Schedulers.boundedElastic()
弹性线程池、超时回收
适合:DB、HTTP、阻塞业务
你的SSE业务层全部用它
5.3 Schedulers.single()
单线程串行
适合:非线程安全组件、顺序任务
5.4 Schedulers.immediate()
- 当前线程执行、不切换
第六章:Netty + Reactor 底层联动(你最困惑的真相)
6.1 两层线程彻底隔离
Netty IO 线程(EventLoop):只做读写、解析、协议处理,绝对不能阻塞
BoundedElastic 业务线程:只做业务、埋点、转换、DB操作
6.2 WebClient Flux 真相
WebClient 链式调用 只构建规则,不执行、无IO
subscribe 触发网络请求
Netty IO 线程收到TCP分片 → 解析SSE → 调用下游 onNext
publishOn 切走线程,保护IO
6.3 Flux 绝对不是容器
Flux/Mono 不存数据、无队列、无缓冲区。
队列只来自:publishOn、FluxSink、buffer操作符。
第七章:Flux.create 深度原理(你的SSE核心)
7.1 create 是手动 Publisher
lambda 在订阅时执行,不是创建时。
7.2 FluxSink 三大能力
next():下发数据
complete():正常结束
error():异常结束
7.3 OverflowStrategy 背压策略
BUFFER:无限缓冲(SSE适用)
ERROR:溢出抛错
DROP_LATEST / DROP_OLDEST:丢弃
7.4 onDispose 唯一兜底
监听:客户端断开、页面关闭、链接取消。doOnComplete/doOnError 监听不到取消。
第八章:生产级SSE两层Flux架构(你的代码架构)
8.1 内层Flux(WebClient)
网络数据源、Netty驱动、纯流式、冷流
8.2 外层Flux(create)
业务封装层:限流、trace、事件封装、资源管控、生命周期绑定
8.3 为什么必须两层
前置同步阻塞逻辑只能放外层
统一封装 error/done 事件
客户端断连自动取消上游请求
自定义背压缓冲策略
第九章:终极线程流转全景(你的接口1:1还原)
Tomcat线程:接收请求、订阅外层Flux、立刻释放
subscribeOn(boundedElastic):切换订阅线程,执行初始化、限流、查库
手动订阅内层WebClient:触发Netty网络请求
Netty IO线程:收TCP、解析SSE、onNext推数据
publishOn(boundedElastic):切走业务逻辑,解放IO线程
业务线程:转换事件、埋点、更新原子引用、emitter.next下发
客户端断连:onDispose触发、dispose上游、释放信号量
第十章:生产级避坑大全
禁止在Netty IO线程执行阻塞逻辑
禁止多处释放信号量(必须doFinally幂等释放)
必须监听onDispose防止资源泄漏
WebClient冷流无需subscribeOn
阻塞初始化必须subscribeOn
业务耗时必须publishOn
绝对禁止block()在WebFlux接口
第十一章:终极口诀(全程贯通)
Flux是规则不是容器,冷流订阅才执行
订阅信号向上走,数据信号向下走
subscribeOn管源头阻塞,publishOn管下游业务
IO线程只收包,业务线程只干活
两层Flux做封装,Sink手动桥接数据流
doFinally统一收尾,杜绝泄漏
全链路背压自动调速,高并发不崩
(注:部分内容可能由 AI 生成)