惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
Simon Willison's Weblog
Simon Willison's Weblog
B
Blog
V
Visual Studio Blog
G
Google Developers Blog
云风的 BLOG
云风的 BLOG
S
SegmentFault 最新的问题
博客园 - 司徒正美
博客园 - 【当耐特】
T
Tenable Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
宝玉的分享
宝玉的分享
N
Netflix TechBlog - Medium
S
Secure Thoughts
Hugging Face - Blog
Hugging Face - Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
IT之家
IT之家
Google DeepMind News
Google DeepMind News
Last Week in AI
Last Week in AI
大猫的无限游戏
大猫的无限游戏
PCI Perspectives
PCI Perspectives
H
Hackread – Cybersecurity News, Data Breaches, AI and More
阮一峰的网络日志
阮一峰的网络日志
P
Privacy International News Feed
N
News and Events Feed by Topic
H
Hacker News: Front Page
MongoDB | Blog
MongoDB | Blog
Google DeepMind News
Google DeepMind News
F
Full Disclosure
Google Online Security Blog
Google Online Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
H
Heimdal Security Blog
Project Zero
Project Zero
C
CERT Recently Published Vulnerability Notes
MyScale Blog
MyScale Blog
AI
AI
月光博客
月光博客
C
Cyber Attacks, Cyber Crime and Cyber Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
WordPress大学
WordPress大学
L
Lohrmann on Cybersecurity
TaoSecurity Blog
TaoSecurity Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
C
CXSECURITY Database RSS Feed - CXSecurity.com
Spread Privacy
Spread Privacy
Apple Machine Learning Research
Apple Machine Learning Research
GbyAI
GbyAI
SecWiki News
SecWiki News
C
Cisco Blogs
The Last Watchdog
The Last Watchdog

博客园 - 意犹未尽

从提示词工程到 Harness 设计范式 VsCode AI生态开源项目 掌握Redis集群通信,解决数据存取难题 jvm堆外内存-direct buffer spring-boot-actuator-Health原理 服务治理 概念、架构、协议格式到裸协议实现,彻底搞懂 MCP 的本质 maven-antrun-plugin插件 Spring AI-MCP源码整理 压测实践案例之网关 elasticseach-分页搜索 sentinel增加ip来源限流后占用服务高内存问题分析 spring-boot-actuator elasticseach-head插件安装及使用 设计模式之美学习-代码命名规范 ES-Client-api-easy es sentinel-ProcessorSlot sentinel-SPI初始化时机 记录一次内存泄漏排查 设计思路之系统做深能力的思维方式
java响应式编程基础
意犹未尽 · 2025-05-12 · via 博客园 - 意犹未尽

什么是响应式编程

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 的库,提供丰富的操作符(如 mapfilterzip)。
  • ​​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();
        }
    }
}