java响应式编程基础
什么是响应式编程
Java 响应式编程(Reactive Programming)是一种基于事件驱动和异步数据流的编程范式,旨在通过非阻塞的方式高效处理数据流和异步操作。它的核心思想是响应变化(如数据更新、用户事件、网络请求等),并通过链式调用的方式组合异步操作
核心概念
- 数据流(Data Stream):一切皆为流,数据以连续事件的形式流动(如用户输入、API 响应、数据库查询结果)。
- 响应式(Reactive):系统能够自动感知数据流的变化,并触发相应的处理逻辑。
- 异步与非阻塞:避免线程阻塞,提高资源利用率(如高并发场景下更高效)。
- 背压(Backpressure):下游控制上游的数据生产速度,防止因生产者过快导致内存溢出。
响应式编程 vs 传统编程
特性 | 传统编程 | 响应式编程 |
---|---|---|
执行模型 | 同步阻塞(如 Thread.sleep() ) |
异步非阻塞(如 Mono.subscribe() ) |
资源利用 | 线程与资源占用高 | 高效利用线程池(如 Reactor 的调度器) |
适用场景 | 简单任务、低并发 | 高并发、实时数据处理(如微服务、流式计算) |
什么是Reactive
是一种理念:它定义了系统如何通过异步、非阻塞、事件驱动的方式响应变化(如用户请求、数据流、故障等)。
java 响应式生态
- Project Reactor:Spring 5+ 的响应式核心库,提供
Flux
(N元素流)和Mono
(0/1元素流)。 - RxJava:基于 ReactiveX 的库,提供丰富的操作符(如
map
,filter
,zip
)。 - Spring WebFlux:基于 Reactor 的异步非阻塞 Web 框架,支持响应式 HTTP 服务。
响应式编程的优势
- 高吞吐量:非阻塞模型允许少量线程处理大量并发请求。
- 弹性:自动处理故障(如重试、熔断)。
- 实时性:适合实时数据推送(如 WebSocket、股票行情)。
- 资源高效:避免线程池过度膨胀。
简单使用
1、pom引入
<dependencies> <!-- Reactor Core(响应式编程核心库) --> <dependency> <groupId>io.projectreactor</groupId> <artifactId>reactor-core</artifactId> <version>3.6.5</version> </dependency> </dependencies>
import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; public class ReactiveDemo { public static void main(String[] args) { // 1. 创建一个包含 1, 2, 3 的 Flux 数据流 Flux<Integer> numbers = Flux.just(1, 2, 3) .log(); // 打印日志(观察数据流事件) // 2. 使用操作符处理数据流 Flux<String> processedStream = numbers .filter(n -> n % 2 == 0) // 过滤偶数 .map(n -> "Number: " + n) // 转换为字符串 .doOnNext(s -> System.out.println("Processed: " + s)); // 副作用操作 // 3. 订阅并消费数据流 processedStream.subscribe( item -> System.out.println("Received: " + item), // 处理数据 error -> System.err.println("Error: " + error), // 错误处理 () -> System.out.println("Stream completed") // 完成回调 ); // 保持主线程不退出(仅示例需要) try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }