Flux 与 Mono - Spring WebFlux入门篇(一)

编程 > Java > Spring (193) 2026-03-30 16:58:33

Spring WebFlux 零基础入门教程

1. 核心概念:什么是响应式?

在开始写代码前,我们需要转变思维。
  • 传统编程 (Spring MVC):像餐厅点餐。你(线程)点完菜后必须坐在那里等,直到服务员(数据库/IO)把菜端上来。如果等待时间过长,你就无法服务其他客人。
  • 响应式编程 (Spring WebFlux):像自助餐或订阅杂志。你发出请求后,不需要干等,可以去处理别的事情。当数据准备好时,系统会通知你,或者数据会像流水一样源源不断地流过来。
核心关键词:
  • 非阻塞:线程不用傻等,处理完一个请求的等待时间可以去处理其他请求。
  • 背压 (Backpressure):如果消费者处理数据的速度慢于生产者产生数据的速度,消费者可以通知生产者“慢点发”,防止系统崩溃。

2. 项目搭建

使用 Spring Initializr 创建项目时,只需勾选 Spring Reactive Web 依赖。
Maven 主要依赖 (pom.xml):
 
<dependencies>
    <!-- 核心依赖:包含 Netty 服务器和 Reactor 库 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
    <!-- 测试依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

3. 核心类型:Mono 与 Flux

WebFlux 只有两个核心类,必须掌握:
类型 含义 形象比喻 示例
Mono 0 或 1 个元素 一个快递包裹 查询单个用户、保存操作
Flux 0 到 N 个元素 一条传送带 查询用户列表、实时股价流

4. 实战编码:模拟数据与接口

我们将创建一个 CounterService 来模拟业务逻辑,并在控制器中暴露接口。
 
第一步:编写模拟服务
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.time.Duration;
import java.util.concurrent.atomic.AtomicInteger;

@Service
public class CounterService {

    // 模拟内存中的计数器
    private final AtomicInteger counter = new AtomicInteger(0);

    /**
     * 模拟一个耗时的增加操作
     * 返回 Mono,因为结果只有一个(新的计数值)
     */
    public Mono<Integer> increment() {
        return Mono.fromSupplier(() -> {
            // 模拟业务逻辑处理耗时
            try { Thread.sleep(500); } catch (Exception e) {}
            return counter.incrementAndGet();
        });
    }

    /**
     * 模拟实时数据流(如股票行情)
     * 返回 Flux,因为数据是源源不断的
     */
    public Flux<String> getStockStream() {
        return Flux.interval(Duration.ofSeconds(1)) // 每隔1秒触发一次
                .map(sequence -> {
                    double price = 100.0 + Math.random() * 10;
                    return String.format("当前股价: %.2f (时间: %d秒)", price, sequence+1);
                })
                .map(message -> "data: " + message) // 数据格式转换(类似stream.map)
                .take(10); // 仅演示:只推送10次后自动结束
    }
}

第二步:编写控制器


import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

@RestController
@RequestMapping("/api")
public class DemoController {

    private final CounterService counterService;

    // 通过构造函数注入
    public DemoController(CounterService counterService) {
        this.counterService = counterService;
    }

    // 1. 获取当前计数 (Mono)
    @PostMapping("/counter")
    public Mono<Integer> getCount() {
        // 注意:这里直接返回 Mono,WebFlux 会自动处理异步结果
        return counterService.increment();
    }

    // 2. 实时数据流 (Flux) - SSE (Server-Sent Events)
    // produces = MediaType.TEXT_EVENT_STREAM_VALUE 告诉浏览器这是流数据
    @GetMapping(value = "/stock-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> streamStock() {
        return counterService.getStockStream();
    }
}

5. 前端交互:可视化展示

为了直观看到 Flux 的流式效果,我们写几个简单的 HTML 页面(放在 resources/static/目录下)。

  • index.html  - 首页用于跳转
  • demo-mono.html - Mono 演示界面
  • demo-flux.html - Flux 演示界面

三个页面源码如下:

成员内容

稀缺资源,此处内容需登录后查阅(刷新)

登录/注册

 

6. 运行与测试

  1. 启动 Spring Boot 应用。
  2. 浏览器访问 http://localhost:8080/index.html。
  3. 选择对应demo页面进入
Flux 与 Mono - &nbsp;Spring WebFlux入门篇(一)_图示-b5ca423c910c46f8a79528261e37820c.png

 

Flux Demo  

点击“开始接收股价推送”按钮 进行测试数据接收

spring-flux

开始接收但没有结束的时候 进行点击“停止“按钮 进行测试中断数据

spring-flux-stop

 

Mono Demo

spring-mono

 

 


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
Flux 和 Mono 区别说明Flux 和 Mono 是 Spring WebFlux 框架中用于响应式编程的核心类型,它们都来自于 Project Reac
Spring WebFlux 零基础入门教程1. 核心概念:什么是响应式?在开始写代码前,我们需要转变思维。传统编程 (Spring MVC):像餐厅点餐。你(
在 Spring WebFlux 中,当 Controller 返回 Flux 时,前端可以通过多种方式接收这个异步、流式的数据。最常见和推荐的方式是使用 Se
Spring WebFlux,spring框架5.0将会新增的web增强框架,这里主要讲述什么是Spring WebFlux以及Spring WebFlux的新功能,Spring WebFlux...
Spring WebFlux 项目实战 在Spring WebFlux中创建多个RouterFunctions,在这篇文章中,我们将着眼于在Spring WebFlux中将多个路由器功能定义到不...
spring boot webflux client实战,webclient是spring webflux的一个小组件。对于Java的http通讯来说,webclient是非常简单易用的。
1.引言Spring 5通过引入一种名为Spring WebFlux的全新反应框架来支持响应式编程范例
引言Spring Boot 2.0最近去了GA,所以我决定写我关于Spring的第一篇文章很长一段时间
环境Spring boot 3.5.5Spring webflux 腾讯云智能体应用 管理接口文档:腾讯云智能体开发平台 对话端接口文档(HTTP SSE)_腾
1.引言Spring开发人员,您是否曾经觉得需要一个易于使用且高效的流畅功能样式 API 的异步/非阻塞 HTTP客户端?如果是,那么我欢迎您阅读关于WebClient的文章,WebClient...
Spring Context 与Spring MVC Context那些坑
从Spring 6和Spring Boot 3开始,Spring framework支持将远程HTTP服务代理为带有HTTP交换注解方法的Java接口。类似的库,如OpenFeign和Retro...
Spring框架Spring IoC容器的核心原理,前三篇已经从历史的角度和大家一起探讨了为什么会有Spring,Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的...
Spring Boot 2.0,Spring框架的Spring Boot 中的Spring Boot Actuator变化讲解。并且了解如何在Spring Boot 2.0中使用Actuator...
java编程中spring框架5.0介绍说明/概述,spring5,spring框架,java编程