Spring WebFlux 是 Spring Framework 5 引入的一个全新的响应式 Web 框架,它与传统的 Spring MVC 不同,是基于 非阻塞 I/O 和响应式流(Reactive Streams) 构建的,适用于高并发、实时数据处理等场景。
一、Spring WebFlux 简介
它是什么?
- Spring WebFlux 是 Spring 提供的第二个 Web 框架(第一个是 Spring MVC),用于构建 非阻塞、异步、响应式的 Web 应用程序。
- 支持两种编程模型:
- 函数式风格(Functional Endpoints)
- 注解式风格(基于 @Controller 的方式,类似 Spring MVC)
它能做什么?
- 处理 HTTP 请求
- 支持 RESTful API 开发
- 集成 WebSocket、Server-Sent Events (SSE)、Streaming 等
- 支持响应式数据库访问(如 R2DBC)
- 与 Spring Security、Spring Data 等集成
二、核心组件和概念
1. Project Reactor
Spring WebFlux 的底层依赖于 Project Reactor,这是一个实现了 Reactive Streams 规范 的库。它提供了两个核心类型:
- Mono<T>:表示 0 或 1 个元素的异步序列
- Flux<T>:表示 0 到 N 个元素的异步序列
这两个类是构建响应式应用的基础。
Mono<String> mono = Mono.just("Hello");
Flux<String> flux = Flux.just("A", "B", "C");
2. WebClient
WebClient 是一个非阻塞的 HTTP 客户端,用来替代传统的 RestTemplate。
示例:
WebClient webClient = WebClient.create("https://api.example.com");
Mono<User> userMono = webClient.get()
.uri("/users/1")
.retrieve()
.bodyToMono(User.class);
3. RouterFunction
这是函数式路由风格的接口,可以更灵活地定义请求路由。
@Configuration
public class GreetingRouter {
@Bean
public RouterFunction<ServerResponse> route(GreetingHandler greetingHandler) {
return RouterFunctions.route(GET("/hello"), greetingHandler::hello);
}
}
三、Spring WebFlux 与 Spring MVC 的区别
特性 | Spring MVC | Spring WebFlux |
编程模型 | 同步阻塞 | 异步非阻塞 |
IO 模型 | Servlet(阻塞) | Netty / Servlet 3.1+(非阻塞) |
数据流处理 | 单线程同步处理 | 响应式流(Reactive Streams) |
使用场景 | 传统业务系统 | 实时数据、高并发、长连接 |
是否支持嵌套容器 | 只能在 Servlet 容器中运行 | 支持嵌套容器(Netty、Tomcat、Jetty) |
主要返回值类型 | ModelAndView、String、Object | Mono、Flux |
四、使用场景推荐
场景 | 推荐框架 |
传统业务系统、后台管理系统 | Spring MVC |
高并发服务、实时消息推送、WebSocket | Spring WebFlux |
微服务网关(如 Spring Cloud Gateway) | Spring WebFlux |
响应式数据库操作(R2DBC) | Spring WebFlux |
流式数据处理(SSE、Stream) | Spring WebFlux |
五、如何创建一个 Spring WebFlux 项目?
你可以通过以下方式快速创建一个 Spring WebFlux 项目:
方法一:使用 start.spring.io
选择以下依赖项:
- Spring WebFlux
- (可选)Spring Boot DevTools、Lombok、Reactive Redis 等
方法二:手动添加 Maven 依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
</dependencies>
六、简单示例:编写一个响应式 Controller
@RestController
@RequestMapping("/api")
public class HelloController {
@GetMapping("/hello")
public Mono<String> sayHello() {
return Mono.just("Hello, Spring WebFlux!");
}
@GetMapping("/stream")
public Flux<String> streamData() {
return Flux.interval(Duration.ofSeconds(1))
.map(seq -> "Data - " + seq);
}
}
访问 /api/hello 将返回一个字符串,而 /api/stream 将每秒返回一次数据,实现服务器端事件流(SSE)。
七、优势总结
高性能:非阻塞模型允许单线程处理多个请求,减少资源消耗
响应式编程:使用 Mono 和 Flux 让异步编程更加直观
现代协议支持:WebSocket、SSE、HTTP/2 等
灵活部署:支持 Tomcat、Jetty、Netty 等多种容器
与微服务生态兼容:Spring Cloud Gateway、Spring Security 等均基于 WebFlux
总结:
Spring WebFlux 是构建现代响应式 Web 应用的核心工具,尤其适合高并发、低延迟、实时性强的后端服务开发。