使用Flux、Mono案例

spring响应式编程06 流式操作:如何使用 Flux 和 Mono 高效构建响应式数据流? 在上一讲中,我为你介绍了 Reactor 响应式编程框架,该框架实现了响应式流规范。我们知道在响应式流规范中,存在代表发布者的 Publisher 接口,而 Reactor 提供了这一接口的两种实现,即 Flux 和 Mono,它们是我们利用 Reactor 框架进行响应式编程的基础组件。在引入 Flux 和 Mono 的概念之后,这一讲的内容将围绕如何创建这两个组件展开。 阅读详情

生产环境中前后端使用Flux的典型案例及技术实现方案:


‌1. 实时监控大屏(后端Flux推送 + 前端SSE消费)‌

‌场景‌:金融交易监控、IoT设备状态追踪
‌技术栈‌:

  • 后端:Spring WebFlux + Reactor Netty
  • 前端:EventSource API + React/Vue
    ‌实现逻辑‌:

javaCopy Code

// 后端示例 @GetMapping(value = "/sensor/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<SensorData> streamSensorData() { return sensorService .getRealtimeUpdates() // 返回Flux<SensorData> .delayElements(Duration.ofMillis(500)); // 控制推送频率 }

‌前端消费‌:


javascriptCopy Code

const eventSource = new EventSource('/sensor/stream'); eventSource.onmessage = (e) => { const data = JSON.parse(e.data); updateDashboard(data); // 实时更新UI };

‌优势‌:

  • 背压控制避免客户端过载
  • 长连接复用降低TCP握手开销

‌2. 批量文件处理(分块流式响应)‌

‌场景‌:CSV导出、日志文件下载
‌技术栈‌:

  • 后端:Spring WebFlux + Reactive MongoDB
  • 前端:Fetch API流式处理
    ‌实现‌:

javaCopy Code

@GetMapping("/export/large-data") public Flux<DataChunk> exportLargeData() { return reactiveMongoTemplate .streamQuery(query, DataEntity.class) .map(this::convertToChunk) // 分块转换 .take(1000); // 限制总量 }

‌前端处理‌:


javascriptCopy Code

fetch('/export/large-data') .then(response => { const reader = response.body.getReader(); const processChunk = ({done, value}) => { if (!done) { appendToFile(value); // 流式写入文件 return reader.read().then(processChunk); } }; return reader.read().then(processChunk); });


‌3. 聊天应用(WebSocket双向流)‌

‌技术栈‌:

  • 后端:Spring Boot WebFlux + RSocket
  • 前端:SockJS + Stomp.js
    ‌核心代码‌:

javaCopy Code

@MessageMapping("chat.{roomId}") public Flux<Message> joinRoom(@DestinationVariable String roomId) { return chatService .subscribe(roomId) // 返回Flux<Message> .onBackpressureBuffer(100); // 缓冲溢出保护 }

‌前端连接‌:


javascriptCopy Code

const stompClient = new Stomp.Client(...); stompClient.subscribe('/topic/chat.123', (msg) => { showMessage(JSON.parse(msg.body)); });


‌关键设计原则‌

  1. ‌背压策略‌:

    • 服务端:.limitRate(100) 限制推送速率
    • 客户端:取消订阅或滑动窗口控制
  2. ‌错误恢复‌:

    • 自动重试逻辑:.retryWhen(Retry.backoff(3, Duration.ofSeconds(1)))
  3. ‌生产级增强‌:

    • 服务端指标:Micrometer监控Flux的订阅/完成率
    • 客户端:添加心跳检测(如每30秒ping/pong)

实际案例参考:

  • 阿里双11大屏使用类似方案处理每秒百万级事件
  • 特斯拉车辆状态同步采用WebFlux+RSocket实现低延迟更新

生产环境中前后端使用Mono的典型场景及技术实现方案:


‌1. 用户身份认证(JWT令牌签发)‌

‌场景‌:登录接口返回单条令牌
‌技术栈‌:

  • 后端:Spring Security + WebFlux
  • 前端:React/Axios
    ‌实现逻辑‌:

javaCopy Code

@PostMapping("/auth/login") public Mono<AuthResponse> login(@RequestBody LoginRequest request) { return authService .authenticate(request.getUsername(), request.getPassword()) .flatMap(user -> Mono.just(jwtUtil.generateToken(user))); // 明确返回单个结果 }

‌前端调用‌:


javascriptCopy Code

axios.post('/auth/login', credentials) .then(response => { localStorage.setItem('token', response.data.token); });

‌优势‌:

  • 明确语义:操作结果唯一且确定
  • 自动HTTP 404处理(当Mono为空时)

‌2. 电商订单支付状态查询‌

‌场景‌:获取单笔订单的实时支付结果
‌技术栈‌:

  • 后端:Spring WebFlux + Redis
  • 前端:Vue/Composition API
    ‌服务端代码‌:

javaCopy Code

@GetMapping("/orders/{id}/payment-status") public Mono<PaymentStatus> getPaymentStatus(@PathVariable String id) { return redisTemplate .opsForValue() .get("payment:" + id) // 返回Mono<PaymentStatus> .switchIfEmpty(Mono.error(new OrderNotFoundException())); }

‌前端消费‌:


typescriptCopy Code

const fetchStatus = async (orderId: string) => { const { data } = await api.get(`/orders/${orderId}/payment-status`); updateUI(data); // 更新支付状态组件 };


‌3. 分布式锁申请(Redis实现)‌

‌场景‌:全局资源互斥访问控制
‌技术栈‌:

  • 后端:Lettuce + Reactor
  • 前端:无直接交互(后台服务间调用)
    ‌核心代码‌:

javaCopy Code

public Mono<Boolean> tryLock(String lockKey, String clientId, Duration ttl) { return redisTemplate.execute(connection -> Mono.from(connection .stringCommands() .set( lockKey.getBytes(), clientId.getBytes(), SetArgs.nx().px(ttl.toMillis()) ) ).map("OK"::equalsIgnoreCase) ); }

‌调用示例‌:


javaCopy Code

lockService.tryLock("inventory:1", "node-1", Duration.ofSeconds(30)) .subscribe(locked -> { if (locked) processInventory(); });


‌关键设计原则‌

  1. ‌语义明确性‌:

    • 当业务逻辑必然返回单个结果(如主键查询)时强制使用Mono
    • 与Flux的流式场景形成鲜明对比
  2. ‌错误处理优化‌:

    • onErrorResume:自动降级为默认值
    • Mono.empty():表示合法空结果(HTTP 204)
  3. ‌生产增强‌:

    • 指标监控:通过Micrometer跟踪Mono的订阅/完成耗时
    • 熔断保护:与Resilience4j集成防止长时间阻塞

典型应用案例:

  • 微信支付状态查询接口严格使用单结果响应
  • 银行核心系统的账户余额查询服务

Reactor框架下的Flux和Mono转换技巧 通过上面的介绍和实例演示,我们可以看到方法在Reactor框架中是一个非常强大的工具。它不仅可以实现Flux和Mono的转换,还可以通过重用和共享代码来提高开发效率。在实际开发中,我们可以根据具体的业务需求,灵活地使用方法来处理各种数据流。希望这篇文章能够对你有所帮助,让你更好地理解和使用Reactor框架。 阅读详情

相关推荐

Reactor教程Mono和Flux例子

Reactor教程Mono和Flux例子,同时可以查看我的博客,有介绍如何使用Reactor的详细教程

JAVA Reactor API ( Flux和Mono)的简单使用

1. 创建Flux及Mono 1.1 使用just从现有的已知内容和大小的数据创建Flux或Mono Flux.just(new Integer[]{1, 2, 3, 4}) //观察者监听被观察者(消费者) .subscribe(System.out::println); //使用可变参数创建Flux Flux.just(1, 2, 3, 4) .subscribe(System.out::println); //使用just创建Mono Mono.just("1s") .subscribe(

weixin_47951400的博客 2万+

Lumerical官方案例、FDTD时域有限差分法仿真学习(十三)——多模干涉耦合器(MMI)

计算通过 1×2 端口多模干涉 (MMI) 耦合器的宽带传输和光损耗。 使用设备 S 参数在 INTERCONNECT 中创建 MMI 的紧凑模型。 它还展示了如何使用 CML 编译器提取这些参数以生成紧凑模型。 一、概述 了解模拟工作流程和关键结果 低损耗光合路器和分路器是基于 Mach-Zehnder 的光调制器的基本组件,并且是集成电路的关键组成部分。通过在输入/输出波导处使用线性锥形确保输入/输出波导的模式与干涉区域之间的

weixin_45719141的博客 1万+

03-Mono & Flux操作

上一节主要介绍了如何基于Mono和Flux构建一个数据流,Mono是Flux的特例,但大部分API 都是一致的所以重点讲的是Flux。本章将讲Flux和Mono的操作符,如 转换、过滤、异常处理、日志、Debug等一些API。 1. buffer buffer方法相当于将序列中的一部分数据收集到一个集合中,并作为一个新的流元素发送到下游。 这里看buffer的重载方法特别多啊,基本功能肯定是一样的只是多了一些附加条件。我们加单示例几种。 示例1: 指定收集的元素个数 public static void

Tong_Rui的博客 4858

统信UOS/麒麟Kylin OS下利用pyenv实现Python多版本开发环境搭建指南

本文详细介绍了在统信UOS和麒麟Kylin OS国产操作系统下使用pyenv搭建Python多版本开发环境的完整指南。从系统环境准备、pyenv定制安装到Python版本编译实战,提供了针对国产CPU架构的特殊优化方案和常见问题解决方法,帮助开发者高效管理不同Python版本需求。

sea99的博客 1051

STM32硬件SPI调试ADS1256的3个致命坑,CubeMX配置避坑指南

本文深入解析STM32硬件SPI调试ADS1256高精度ADC芯片时常见的3大配置陷阱,包括SPI时钟频率、时钟极性与相位、数据字节序等关键问题。通过CubeMX实战配置指南和实测数据对比,提供稳定可靠的解决方案,帮助开发者避免常见错误,提升采样精度和系统稳定性。

weixin_42550597的博客 346

Spring WebFlux的Flux和Mono入门

在现代Web开发中,对于高性能和可伸缩性的需求越来越高。Spring Framework 5.0引入了Spring WebFlux,这是一个基于Reactive Streams的非阻塞响应式编程模型。在Spring WebFlux中,Flux和Mono是两个核心的类型,它们分别用于处理多个值和单个值的异步序列。

2401_86613005的博客 1124

华为OD机试:查找接口成功率最优时间段 (C/C++/Py/Java/JS/GO)

华为OD机试双机位C卷 查找接口成功率最优时间段,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。

qq_45776114的博客 4686

flux mono 转_从Flux转换到Mono(Convert from Flux to Mono)

从Flux转换到Mono(Convert from Flux to Mono)如何将1个元素的Flux转换为Mono?Flux.fromArray(arrayOf(1,2,1,1,1,2)).distinct().take(1)我如何使这个单声道(1)?How can I convert from a Flux with 1 element to a Mono?Flux.fromArray(arr...

weixin_29783347的博客 4686

Xiaojie雷达之路---手把手教你从串口获取雷达原始数据(一)---新建工程(开始)

Hello,大家好,我是Xiaojie,欢迎大家能够和Xiaojie来一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章---利用串口获取毫米波雷达中的原始数据,本系列文章将从新建工程到最后原始数据显示到PC上进行逐步介绍,这个系列的文章大约是一个4-5篇左右。本篇文章呢,主要讲的是如何新建一个毫米波雷达的工程。

XiaoJie的博客 5810

南京理工大学计算机预推免面试(双非重点关注)

南京理工大学总体来说对双非学校比较友好,上岸率比较高,而且面试形式是线上,在预推免的过程中,可以作为重点关注的学校,但是一定要注意南理报名截止的时间,部分学校可能保研名额公示的比较晚,对于保研边缘人来说很可能会错过,我的建议是,即使不确定能否拿到保研名额,先查一下截止时间,先在系统上报名!!一旦拿到了offer,就是铁的,保底专硕,而且有很大的技巧性,一定要认真看哈!!!每个人的情况可能都不一样,如果有需要帮忙可以私我~~~

D1379951481的博客 2017

关于Mono和Flux的理解

1. 前言 很多同学反映对响应式编程中的Flux和Mono这两个Reactor中的概念有点懵逼。但是目前Java响应式编程中我们对这两个对象的接触又最多,诸如Spring WebFlux、RSocket、R2DBC。我开始也对这两个对象头疼,所以今天我们就简单来探讨一下它们。 2. 响应流的特点 要搞清楚这两个概念,必须说一下响应流规范。它是响应式编程的基石。他具有以下特点: 响应流必须是无阻塞的。 响应流必须是一个数据流。 它必须可以异步执行。 并且它也应该能够处理背压。 背压是反应流中的一

程柯梦想 8293

YOLOv8魔改系列:将CIoU替换成Wise-IoU,飞速涨点

将YOLOv8中CIoU替换成Wise-IoU,实现飞速涨点

qq_66386046的博客 2678

Mono和Flux讲解

和是响应式编程库 Reactor 的核心组件,主要用于处理异步流和响应式数据流。它们的设计基于 Reactive Streams 规范,提供了非阻塞的方式处理数据。

HGX-DJK 1252

【纯干货分享】常用高速接口眼图模板合集

文章汇集了常见的高速接口的信号眼图测试模板技术要求,比如,LPDDR5/4、PCIe 5.0/4.0、USB、MIPI等等,方便工程师快速进行查询和使用。

一只豌豆象的博客 3116

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Mono和Flux的用法详解

WebFlux的Flux和Mono用法 Flux just 可以指定序列中包含的全部元素。创建出来的 Flux 序列在发布这些元素之后会自动结束。 fromArray(),fromIterable()和 fromStream() 可以从一个数组、Iterable 对象或 Stream 对象中创建 Flux 对象。 empty() 创建一个不包含任何元素,只发布结束消息的序列,在响应式编程中,流的...

lz710117239的博客 5万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

响应式编程中的Flux和Mono

响应式编程介绍 反应式编程来源于数据流和变化的传播,意味着由底层的执行模型负责通过数据流来自动传播变化。比如求值一个简单的表达式 c=a+b,当 a 或者 b 的值发生变化时,传统的编程范式需要对 a+b 进行重新计算来得到 c 的值。如果使用反应式编程,当 a 或者 b 的值发生变化时,c 的值会自动更新。反应式编程最早由 .NET 平台上的 Reactive Extensions (Rx) 库...

琅天溪的博客 2万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

flux mono 转_Flux转Mono next()

importjava.util.LinkedHashMap;importjava.util.Map;importjava.util.Map.Entry;importjava.util.NoSuchElementException;importlombok.extern.slf4j.Slf4j;importorg.apache.commons.lang3.time.StopWatch;importr...

weixin_30620431的博客 1142

Reactor的Flux和mono

在上面的代码中,我们首先定义了一个`Flux<Integer>`,然后将其转换为`List<Integer>`,最后输出`List<Integer>`。接着,我们又定义了一个`List<Integer>`,然后将其转换为`Flux<Integer>`,最后输出`Flux<Integer>`。`Flux`和`Mono`都是响应式编程模型中的重要概念,它们分别表示异步序列流和同步序列流。在使用时,我们可以将`Flux`和`Mono`相互转换为`List`,以方便我们对序列进行处理和操作。

m0_68856746的博客 901

Reactor中的Flux和Mono的区别

是Reactor框架中两个核心的数据流类型,分别适用于不同的场景。在实际开发中,根据具体需求选择合适的类型,并合理利用提供的操作符,可以显著提升代码的可读性和系统的性能。它适用于需要处理多个事件的情况,如从数据库中获取一组记录或者实时数据流。是两个核心的类型,分别用于处理不同的数据流场景。: 更适合需要快速响应的场景,因为它只关注单个结果,减少了不必要的复杂性。设计的,用于处理多元素流,而有些则更适合处理单值结果。,表示可能会有零个或一个用户的单个结果。,表示可能会有多个用户的流被处理。

2401_89793006的博客 1461

Flux功能介绍,完整使用示例,与Mono对比

核心定义Flux是Reactor库中的核心接口,表示一个异步的、包含零到多个元素的序列(类似流式数据处理)[3][4][7它可以处理无限长度的数据流,适用于需要持续处理多个事件的场景[4][8关键特性异步非阻塞:基于响应式编程模型,以事件驱动方式处理数据流,避免阻塞主线程[3][4背压支持:通过背压机制协调生产者与消费者速率,防止数据过载[3][8丰富操作符:提供mapfilterflatMapmerge等操作符,支持数据转换、合并、分组等复杂逻辑[3][7多源组合。

bsklhao的博客 1649

我对响应式编程中Mono和Flux的理解

1. 前言很多同学反映对响应式编程中的Flux和Mono这两个Reactor中的概念有点懵逼。但是目前Java响应式编程中我们对这两个对象的接触又最多,诸如Spring WebFlux、...

码农小胖哥 5361

Flux和Mono的常用API源码分析

Flux定义了一个普通的响应式流,它可以产生零个,一个或多个元素,乃至无限个元素。我们就先来研究一下Flux产生元素的代码 Flux.just其实是返回了一个FluxArray对象。那么我们来看看FluxArray的源码是如何。看的关键点是构造方法和subscribe方法从源码中就可以看出,1个或多个的数据原理就是因为内部有一个数组,这个数组长度可能是1个或多个,然后保存起来通过一个 ArraySubscription 传递给消费者。消费者的代码逻辑可以参照上一篇说的 LambdaSubscriber

m0_67261762的博客 5804

响应式编程中Mono和Flux的区别

当我们在使用Project Reactor,或者使用依赖于它的框架的时候。例如spring webflux,spring cloud gateway等,经常会用看到代码中有Mono和Flux两个术语。

xp_lx12的博客 2110
上一篇: 构建高可用二级缓存系统
下一篇: 数据中台概念
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值