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

响应式编程基础

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

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

java 复制代码
Mono.just("Hello")
Flux.fromIterable(Arrays.asList(1, 2, 3))

项目初始化

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

XML 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

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

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

路由与处理器

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

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

注解式控制器示例:

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

响应式数据库集成

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

yaml 复制代码
spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/test

响应式 Repository 接口:

java 复制代码
public interface UserRepository extends ReactiveMongoRepository<User, String> {
    Flux<User> findByAgeGreaterThan(int age);
}

错误处理机制

全局异常处理示例:

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

响应式错误处理操作符:

java 复制代码
return userService.getUser(id)
    .onErrorResume(e -> Mono.just(new User("fallback")));

测试策略

WebTestClient 是测试 WebFlux 的主要工具:

java 复制代码
@SpringBootTest
class UserControllerTest {
    
    @Autowired
    private WebTestClient webClient;

    @Test
    void testGetUser() {
        webClient.get().uri("/users/1")
            .exchange()
            .expectStatus().isOk();
    }
}

高级特性

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

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

响应式 WebSocket 支持:

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

性能优化

关键配置参数:

yaml 复制代码
server:
  reactor:
    netty:
      max-in-memory-size: 10MB
      connection-timeout: 30s

背压策略建议:

  • 使用 onBackpressureBuffer 缓冲溢出
  • 采用 limitRate 限制请求速率
  • 实现自定义 BaseSubscriber 控制消费速度
相关推荐
艾莉丝努力练剑9 分钟前
【QT:解决问题】Qt5Core.dll:无法定位程序输入点
java·开发语言·qt·学习·面试
小蒜学长19 分钟前
“喵汪联盟”宠物领养系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·宠物
程序员黑豆20 分钟前
Java字符串常量池完全指南:原理、intern()方法与性能优化最佳实践
java·前端·ai编程
AI人工智能+电脑小能手23 分钟前
大白话说Java设计模式-14-适配器模式(业务实战篇)
java·设计模式·适配器模式·系统兼容·多渠道对接
SomeB1oody25 分钟前
【RustyML入门】3.7. 循环层
开发语言·后端·机器学习·rust·教程
xbgRS3 小时前
springboot的自动装配
java·spring boot
东风破_10 小时前
ESLint 是什么?为什么你的项目需要它?
前端·后端·代码规范
嘻哈∠※10 小时前
0061基于 SpringBoot 的投稿与稿件处理系统设计与实现
java·spring boot·后端
卷无止境11 小时前
在 awesome-fastapi 里,哪些库值得一看?
后端·python
白狐_79811 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法