Webflux介绍
1. 什么是 WebFlux?
Spring WebFlux 是 Spring Framework 5 中引入的一个响应式 Web 框架,它是为了支持非阻塞异步通信和响应式流处理而设计的。 与传统的基于 Servlet 的 Spring MVC 模型不同,WebFlux 基于Reactive Streams 规范,提供了一种完全异步和非阻塞的编程模型
WebFlux 核心基于 Reactor 项目,使用 Mono 和 Flux 这两个主要的反应式抽象来处理单值和多值的流。
2. WebFlux 与 Spring MVC 的区别
Spring MVC 是基于 Servlet 规范的,它使用同步阻塞式的 I/O 模型,适合传统的 Web 应用程序。 每个请求对应一个线程,在处理请求的过程中,线程可能会因为 I/O 操作(例如数据库查询或远程调用)而处于阻塞状态。
WebFlux 则是完全异步的,它使用了 Netty 或 Undertow 这样的非阻塞服务器。 WebFlux 应用的每个请求并不占用线程去等待 I/O 结果,而是基于事件驱动模型,当有数据准备好时才进行处理,这极大地提高了并发处理的能力和资源利用率。
| API | Servlet | WebFlux |
|---|---|---|
| 前端控制器 | DispatcherServlet | DispatcherHandler |
| 处理器 | Controller | WebHandler |
| 请求 | ServletRequest | ServerHttpRequest |
| 响应 | ServletResponse | ServerHttpResponse |
| 过滤器 | HttpFilter | WebFilter |
| 异常处理器 | HandlerExceptionResolver | DispatchExceptionHandler |
| Web配置 | @EnableWebMvc | @EnableWebFlux |
| 自定义配置 | WebMvcConfigurer | WebFluxConfigurer |
| 返回结果 | 任意 | Mono、Flux、任意 |
| 发送REST请求 | RestTemplate | WebClient |
3. Webflux的特点
3-1. 非阻塞 I/O 操作
WebFlux 最显著的特点是其非阻塞 I/O 操作。在处理高并发场景时,WebFlux 能够避免因大量线程阻塞等待 I/O 而带来的性能开销。 非阻塞模型可以使应用在处理大量请求时具备更高的可伸缩性。
3-2. 响应式编程模型
WebFlux 基于响应式编程,提供了一个更适合流式数据处理的编程范式。它使用 Flux 和 Mono 作为核心抽象:
- Mono:表示 0 或 1 个元素的异步序列。
- Flux:表示 0 到 N 个元素的异步序列。
通过这些抽象,开发者可以方便地处理数据流、组合异步操作,并且能够轻松处理如 backpressure(背压)等复杂的场景。
3-3. 性能更好
WebFlux 是异步非阻塞的,它能够更有效地利用 CPU 和内存资源,特别是在处理高并发请求时。 与传统的同步阻塞模型相比,WebFlux 应用通常能更好地处理大量并发请求,而不会遇到线程耗尽的问题。
3-4. 支持多种 Web 容器
WebFlux 不是基于传统的 Servlet 容器,而是支持 Netty 和 Undertow 等非阻塞服务器。 此外,它也可以运行在支持 Servlet 3.1+ 规范的容器(如 Tomcat 和 Jetty)中,但在这种情况下,WebFlux 会以异步非阻塞的方式运行。
能摸鱼就很舒服