尧图精选

响应式编程入门:从 Mono 到 Flux 的实战指南

🕒 发布时间:2026/10/1 3:00:19 📁 来源:尧图网络
一、什么是响应式编程传统编程是同步阻塞的你调一个方法线程停在那里等结果。响应式编程是异步非阻塞的你把任务声明好交给框架有结果了再通知你。核心思想是数据以流的形式流动谁需要谁订阅。Java 里最主流的响应式库是ReactorSpring WebFlux 就是基于它。二、两个核心类型类型元素个数场景MonoT0 或 1 个单个结果比如查询、执行图FluxT0 到 N 个流式数据比如 SSE、多行输出它们都是惰性的不订阅就不会执行。三、惰性执行MonoString mono Mono.fromCallable(() - { System.out.println(执行了); return 结果; }); // 此时不会打印执行了 mono.subscribe(); // 订阅后才执行打印执行了为什么惰性框架可以把多个操作符组合成一条链最后一次性执行而不是每步都立即触发。四、常见操作符1. map —— 同步转换Mono.just(abc).map(s - s.length()); // MonoInteger把每个元素同步转换成另一个值。2. flatMap —— 异步转换Mono.just(abc).flatMap(s - Mono.just(s.length())); // MonoInteger里面的 Lambda 返回一个MonoflatMap会自动展平避免MonoMonoT。3. then —— 做完 A 再做 BdoA().then(doB());忽略 A 的结果A 完成后执行 B。4. onErrorResume —— 异常兜底前面任何一步出错就返回兜底值不让异常往上抛。5. flatMapMany —— Mono 转 FluxMonoString.flatMapMany(s - Flux.just(s));把一个Mono展开成Flux。五、线程调度1. subscribeOn —— 指定执行线程池.subscribeOn(Schedulers.boundedElastic())告诉 Reactor这段代码在哪个线程池执行。2. 常见 Schedulers调度器用途线程数immediate()当前线程不切换single()单线程1parallel()CPU 密集CPU 核数boundedElastic()阻塞 IOCPU 核数 × 103. 为什么要切线程因为数据库操作、HTTP 调用是阻塞的。如果直接在主线程执行主线程被占住无法处理其他请求。并发能力急剧下降。用subscribeOn(boundedElastic())把阻塞操作挪到专用线程池主线程继续处理其他请求。六、阻塞 vs 非阻塞对比项阻塞JDBC非阻塞Reactor调用方式同步异步线程行为原地等立即返回返回值结果本身Mono/Flux线程利用率低高关键点Mono本身是非阻塞的但里面可以包装阻塞代码。用subscribeOn把阻塞代码挪走就能避免拖累主线程。七、链式调用响应式代码是链式的把多个操作串成一条流水线step1() .then(step2()) .flatMap(result - step3(result)) .onErrorResume(e - fallback()) .flatMapMany(Flux::just);每个操作符返回新的Mono或Flux可以继续链式操作。八、和 CompletableFuture 的区别对比项CompletableFutureMono/Flux惰性否是元素个数1 个0~1Mono/ 0~NFlux组合能力有限强支持zip、merge、timeoutWebFlux 配合需要包装原生支持空值表示无Mono.empty()九、总结概念一句话Mono异步的 0 或 1 个结果Flux异步的 0 到 N 个结果map同步转换flatMap异步转换 展平then做完 A 再做 BonErrorResume异常兜底flatMapManyMono 转 FluxsubscribeOn指定执行线程池boundedElastic阻塞任务的专用线程池核心思想声明式地描述“做什么”而不是“怎么做”。把多个异步操作串成一条链由框架负责调度、组合、异常处理。阻塞代码用subscribeOn挪到专用线程池主线程保持非阻塞。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →