news 2026/7/1 17:44:35

Spring Boot 响应式 WebFlux 从入门到精通

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Spring Boot 响应式 WebFlux 从入门到精通

响应式编程基础

响应式编程是一种基于数据流和变化传播的编程范式。Spring WebFlux 是 Spring 框架提供的响应式 Web 栈,基于 Reactor 库实现。核心概念包括 Publisher(发布者)、Subscriber(订阅者)和背压(Backpressure)机制。

Reactor 提供两种核心类型:Mono(0-1 个元素)和 Flux(0-N 个元素)。创建示例:

Mono.just("Hello") Flux.fromIterable(Arrays.asList(1, 2, 3))

项目初始化

使用 Spring Initializr 创建项目时需选择 Reactive Web 依赖。Maven 配置示例:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>

基础启动类需启用响应式支持:

@SpringBootApplication public class WebfluxApplication { public static void main(String[] args) { SpringApplication.run(WebfluxApplication.class, args); } }

路由与处理器

WebFlux 提供函数式路由声明方式。典型路由配置:

@Bean public RouterFunction<ServerResponse> routes() { return RouterFunctions.route() .GET("/hello", request -> ServerResponse.ok().body(Mono.just("Hello WebFlux"), String.class)) .build(); }

注解式控制器示例:

@RestController @RequestMapping("/users") public class UserController { @GetMapping("/{id}") public Mono<User> getUser(@PathVariable String id) { return userRepository.findById(id); } }

响应式数据库集成

Spring Data 提供响应式 Repository 支持。配置 MongoDB 示例:

spring: data: mongodb: uri: mongodb://localhost:27017/test

响应式 Repository 接口:

public interface UserRepository extends ReactiveMongoRepository<User, String> { Flux<User> findByAgeGreaterThan(int age); }

错误处理机制

全局异常处理示例:

@ExceptionHandler public Mono<ResponseEntity<String>> handle(Exception ex) { return Mono.just(ResponseEntity .status(HttpStatus.INTERNAL_SERVER_ERROR) .body(ex.getMessage())); }

响应式错误处理操作符:

return userService.getUser(id) .onErrorResume(e -> Mono.just(new User("fallback")));

测试策略

WebTestClient 是测试 WebFlux 的主要工具:

@SpringBootTest class UserControllerTest { @Autowired private WebTestClient webClient; @Test void testGetUser() { webClient.get().uri("/users/1") .exchange() .expectStatus().isOk(); } }

高级特性

服务器推送事件(SSE)实现:

@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<String> streamEvents() { return Flux.interval(Duration.ofSeconds(1)) .map(i -> "Event " + i); }

响应式 WebSocket 支持:

@Bean public HandlerMapping webSocketHandlerMapping() { Map<String, WebSocketHandler> map = new HashMap<>(); map.put("/echo", new EchoHandler()); return new SimpleUrlHandlerMapping(map, -1); }

性能优化

关键配置参数:

server: reactor: netty: max-in-memory-size: 10MB connection-timeout: 30s

背压策略建议:

  • 使用onBackpressureBuffer缓冲溢出
  • 采用limitRate限制请求速率
  • 实现自定义BaseSubscriber控制消费速度
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/28 23:12:30

xTaskCreate与外设驱动集成:从零实现

从裸机到多任务&#xff1a;用xTaskCreate构建真正“活着”的嵌入式系统你有没有遇到过这样的场景&#xff1f;一个简单的温湿度采集项目&#xff0c;开始只是轮询读一下传感器、点个灯、串口打个日志。后来加了 LoRa 发送&#xff0c;再后来要支持远程配置命令&#xff0c;还要…

作者头像 李华
网站建设 2026/6/26 8:50:08

Arduino安装驱动手动加载步骤:项目应用实例

Arduino驱动安装实战&#xff1a;从手动加载到工业传感器采集的完整链路打通 你有没有遇到过这样的场景&#xff1f; 新买的Arduino开发板插上电脑&#xff0c;IDE里却死活找不到端口&#xff1b;设备管理器里躺着一个带黄色感叹号的“未知USB设备”&#xff1b;点击上传代码…

作者头像 李华
网站建设 2026/6/29 0:17:35

[特殊字符]️_开发效率与运行性能的平衡艺术[20260113165855]

作为一名经历过无数项目开发的工程师&#xff0c;我深知开发效率与运行性能之间的平衡是多么重要。在快节奏的互联网行业&#xff0c;我们既需要快速交付功能&#xff0c;又需要保证系统性能。今天我要分享的是如何在开发效率和运行性能之间找到最佳平衡点的实战经验。 &#…

作者头像 李华
网站建设 2026/7/1 19:50:25

互联网大厂Java面试:从Java SE到微服务的技术深度剖析

场景描述 在互联网大厂的一次Java面试中&#xff0c;程序员谢飞机面对严肃的面试官&#xff0c;开始了一场技术上的较量。面试官精心准备了一系列从Java SE到微服务的技术问题&#xff0c;涵盖了广泛的技术栈&#xff0c;包括Java语言、构建工具、web框架以及微服务架构等。 第…

作者头像 李华
网站建设 2026/7/1 22:56:03

Windows设备管理器驱动安装:操作指南(手把手教学)

手把手教你搞定Windows驱动安装&#xff1a;从“未知设备”到完美识别 你有没有遇到过这样的情况&#xff1f;刚插上一个新买的USB网卡&#xff0c;或者换了一块主板&#xff0c;结果系统里冒出个“未知设备”&#xff0c;还带个黄色感叹号。点开一看&#xff0c;啥信息都没有…

作者头像 李华
网站建设 2026/6/29 23:42:32

深入理解XPath文本节点的选取

在Web开发中&#xff0c;XPath是一种强大的工具&#xff0c;用于在HTML或XML文档中定位节点。今天&#xff0c;我们将深入探讨XPath在处理文本节点时的一个常见问题&#xff0c;并通过实际的HTML例子来解释如何正确地使用XPath。 问题描述 假设我们有一个HTML片段如下&#x…

作者头像 李华