news 2026/4/13 22:37:21

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/4/7 14:04:39

紧急Bug处理:流程、四阶段控制法及工具方法

一、核心原则与分级标准紧急Bug处理的第一要务是控制影响&#xff0c;而非追求完美。必须建立明确的优先级判断标准&#xff0c;避免在压力下做出错误决策。四级分类法提供快速定级依据&#xff1a;P0致命级&#xff1a;核心业务中断&#xff0c;需立即停下手头一切工作处理&am…

作者头像 李华
网站建设 2026/4/7 20:07:45

[特殊字符]_可扩展性架构设计:从单体到微服务的性能演进[20260113164432]

作为一名经历过多次系统架构演进的老兵&#xff0c;我深知可扩展性对Web应用的重要性。从单体架构到微服务&#xff0c;我见证了无数系统在扩展性上的成败。今天我要分享的是基于真实项目经验的Web框架可扩展性设计实战。 &#x1f4a1; 可扩展性的核心挑战 在系统架构演进过…

作者头像 李华
网站建设 2026/4/12 9:34:00

字节 2025 绩效考评开始,新调整来了!

大家好&#xff0c;我是鸭鸭&#xff01; 字节一年两度的绩效考核要开始了。在字节的同学&#xff0c;应该上周四就收到了全员信&#xff1a;2026 年 1 月 15 日将启动全年绩效评估。 又到了发钱的时候&#xff01;虽然不能进鸭鸭兜里&#xff0c;但想想还是有点小激动呢&…

作者头像 李华
网站建设 2026/4/9 12:53:27

车载电子PCB工艺选型要求:项目应用解析

车载电子PCB工艺选型实战指南&#xff1a;从设计到可靠的工程闭环为什么一块车规级PCB不能“照搬”消费类经验&#xff1f;你有没有遇到过这样的情况&#xff1a;同一块电路板&#xff0c;用在工控设备上稳定运行三年&#xff0c;放到发动机舱里却三个月就出现通信中断&#xf…

作者头像 李华
网站建设 2026/4/4 16:48:52

Excel VBA:精准选取与移动数据

引言 在处理大量Excel数据时&#xff0c;如何高效地选取特定条件的行并移动它们是一个常见的问题。今天我们将探讨如何使用VBA来实现这一目标&#xff0c;确保我们的代码既高效又易于维护。 背景 假设我们有一份Excel工作表&#xff0c;其中包含了大量的销售数据。我们需要找到…

作者头像 李华
网站建设 2026/4/11 3:36:21

什么是QAM

文章目录为什么要有QAMQAM是如何工作的QAM的星座图噪声与干扰对QAM的影响QAM如何与Wi-Fi配合使用正交幅度调制QAM&#xff08;Quadrature Amplitude Modulation&#xff09;是Wi-Fi中一种常用的数字信号调制&#xff0c;是相位调制和幅度调制的组合。 为什么要有QAM QAM在用于…

作者头像 李华