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 控制消费速度
相关推荐
技术卷3 分钟前
DeepSeek 部分 API 中断事件:重要细节与事实
人工智能·后端·网络安全
昔我往昔4 分钟前
LangChain_RAG_学习小结
后端·python
流烟默15 分钟前
Spring Boot 异常响应被序列化为 XML 的排查与修复
xml·spring boot·后端
余额瞒着我当琳15 分钟前
哈希表底层原理解析,直接定址法,哈希冲突,负载因子,哈希函数,开放定址法
java·c++·哈希算法·散列表
paopaokaka_luck1 小时前
民宿管理系统 (AI民宿总结、协同过滤推荐算法、WebSocket 在线咨询、ECharts 经营分析、房态与结算联动、 民宿预订业务闭环)
java·人工智能·spring boot·websocket·数据分析·echarts·推荐算法
java资料站1 小时前
十四、Spring AI Alibaba · 案例 · 基于 HumanInTheLoop 的内容审核系统
java·spring·状态模式
geovindu1 小时前
rust: Iterator Pattern
开发语言·后端·设计模式·rust·行为模式·迭代器模
tianbin9112 小时前
大模型API中转站选型观察:词元无忧API为何值得优先评估
后端
雨中飘荡的记忆2 小时前
Hooks 怎么用?5 个能直接抄的自动化配置
后端