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

推荐订阅源

S
Schneier on Security
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Know Your Adversary
Know Your Adversary
G
GRAHAM CLULEY
V
Vulnerabilities – Threatpost
P
Palo Alto Networks Blog
Security Latest
Security Latest
P
Privacy & Cybersecurity Law Blog
Simon Willison's Weblog
Simon Willison's Weblog
A
Arctic Wolf
T
Tor Project blog
T
Threatpost
NISL@THU
NISL@THU
I
InfoQ
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Apple Machine Learning Research
Apple Machine Learning Research
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
aimingoo的专栏
aimingoo的专栏
Microsoft Azure Blog
Microsoft Azure Blog
WordPress大学
WordPress大学
K
Kaspersky official blog
W
WeLiveSecurity
L
LINUX DO - 热门话题
小众软件
小众软件
Recorded Future
Recorded Future
B
Blog RSS Feed
H
Help Net Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
L
Lohrmann on Cybersecurity
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
阮一峰的网络日志
阮一峰的网络日志
V
Visual Studio Blog
Blog — PlanetScale
Blog — PlanetScale
雷峰网
雷峰网
爱范儿
爱范儿
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threat Research - Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
H
Hacker News: Front Page
博客园 - 三生石上(FineUI控件)
N
Netflix TechBlog - Medium
P
Proofpoint News Feed
有赞技术团队
有赞技术团队
N
News and Events Feed by Topic
云风的 BLOG
云风的 BLOG
Scott Helme
Scott Helme
V2EX - 技术
V2EX - 技术

博客园 - 意犹未尽

从提示词工程到 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();
        }
    }
}