news 2026/6/5 8:17:15

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/5/22 7:26:17

智能环境监测仪:proteus数码管实时数据显示教程

从仿真到实战&#xff1a;如何用Proteus实现智能环境监测仪的数码管实时显示你有没有遇到过这样的情况&#xff1f;想做一个能测温湿度的小设备&#xff0c;但还没买开发板、没焊电路&#xff0c;代码写好了却不知道能不能跑通&#xff1f;调试时发现数码管闪烁、乱码&#xff…

作者头像 李华
网站建设 2026/5/31 23:43:20

⚡_实时系统性能优化:从毫秒到微秒的突破[20260113165144]

作为一名专注于实时系统性能优化的工程师&#xff0c;我在过去的项目中积累了丰富的低延迟优化经验。实时系统对性能的要求极其严格&#xff0c;任何微小的延迟都可能影响系统的正确性和用户体验。今天我要分享的是在实时系统中实现从毫秒到微秒级性能突破的实战经验。 &#…

作者头像 李华
网站建设 2026/5/10 7:39:19

UE5 如何显示蓝图运行流程

运行UE5蓝图的时候会显示运行时候的步骤&#xff0c;方便调试&#xff0c;具体开启方法如下&#xff1a; 1、打开蓝图编辑器 2、将项目点击Play运行起来 3、这时候这里是显示未选中调试对象 4、下拉选择要调试的对象&#xff08;如果没有下拉选项&#xff0c;确定游戏页面中…

作者头像 李华
网站建设 2026/5/31 12:47:22

通过SMBus读取电源状态寄存器:操作指南

如何用SMBus读取电源状态寄存器&#xff1f;一文讲透原理与实战你有没有遇到过这样的问题&#xff1a;系统突然宕机&#xff0c;日志里却找不到原因&#xff0c;最后怀疑是电源异常&#xff0c;但又无法复现&#xff1f;在服务器、工业控制板或高性能嵌入式设备中&#xff0c;这…

作者头像 李华
网站建设 2026/5/10 4:50:17

GeoPandas绘图技巧:如何优雅地在地图上标注县城信息

引言 在使用GeoPandas进行地理数据可视化时,如何在同一张地图上叠加多个信息层并保持整洁清晰,是许多数据分析师和开发者面临的挑战。本文将结合实际案例,介绍如何利用GeoPandas的高级功能,实现在地图上标注县城的名称和面积信息。 GeoPandas简介 GeoPandas是Python的一…

作者头像 李华
网站建设 2026/5/15 9:41:47

隐藏式门把手再出致命隐患,断电锁死车门,差点出事故

1月11日安徽阜阳市S12滁新高速一辆电车因电量耗尽断电停在应急车道&#xff0c;驾驶人一家五口被困车内&#xff0c;报警求助&#xff0c;交警到达后问清原因后也无法帮忙打开车门&#xff0c;最后叫来拖车将车拖到附近服务区充电桩插上充电头才打开车门。对此&#xff0c;车主…

作者头像 李华