spring boot2的webflux尝试

本文详细介绍了SpringBoot 2中引入的WebFlux模块,包括其响应式HTTP和WebSocket支持,以及异步非阻塞的编程模型。WebFlux基于Reactor实现,支持Servlet3.1+容器的异步处理,对比传统的Spring MVC,WebFlux在吞吐量和响应时间上表现更优。文章还提供了如何从spring-boot-starter-web迁移到spring-boot-starter-webflux的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring boot2中增加了webflux,webflux是什么?

Spring WebFlux 是 Spring 5 的一个新模块,包含了响应式 HTTP 和 WebSocket 的支持,另外在上层服务端支持两种不同的编程模型:

  • Spring WebFlux是异步,非阻塞的。
  • WebFlux有Mono,Flux两种集合类型。
  • Mono是0->1集合类型,比如Mono。
  • Flux是1->n集合类型,比如Flux<List>
  • Mono,Flux都是异步处理的,而集合对象基本上是同步的。

相比于同步的spring MVC, 异步非阻塞的Spring WebFlux在吞吐量,响应时间上会更优

怎么用? 其实从spring-boot-starter-web换到spring-boot-starter-webflux很简单,因为他是基于Spring MVC 的注解,只需要将pom.xml中的spring-boot-starter-web换为spring-boot-starter-webflux就可以了

<-- <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency> -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

spring-boot-starter-webflux的默认内置容器是netty; 他只支持Servlet 3.1+ 容器

为啥只能运行在 Servlet 3.1+ 容器?

大家知道,3.1 规范其中一个新特性是异步处理支持。
异步处理支持:Servlet 线程不需一直阻塞,即不需要到业务处理完毕再输出响应,然后结束 Servlet线程。异步处理的作用是在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,在不生成响应的情况下返回至容器。主要应用场景是针对业务处理较耗时的情况,可以减少服务器资源的占用,并且提高并发处理速度。
所以 WebFlux 支持的容器有 Tomcat、Jetty(Non-Blocking IO API) ,也可以像 Netty 和 Undertow 的本身就支持异步容器。在容器中 Spring WebFlux 会将输入流适配成 Mono 或者 Flux 格式进行统一处理。

 

注意点:

如果你的工程中使用了swagger2 低于3.0.0版本(查资料3.0.0版本开始支持webflux,但是截至现在还没发布,只有快照版), 启动会报错,因为目前swagger2还不支持webflux.

我这边找到了3.0.0-SNAPSHOT版快照库:

<repositories>
    <repository>
        <id>jcenter-snapshots</id>
        <name>jcenter</name>
        <url>http://oss.jfrog.org/artifactory/oss-snapshot-local/</url>
    </repository>
</repositories>

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-swagger2</artifactId>
    <version>3.0.0-SNAPSHOT</version>
</dependency>

想尝鲜的可以试一下,我这边公司网络有问题jar包一直没下载下来,所以就没有试成功

还有一点要注意就是spring MVC 是基于 Servlet, 而webflux是基于 Reactor 实现的,所以如果你的工程中使用了Servlet的过滤器,监听器等,会出现jar包找不到的错误

如:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

 

### 移除Spring Cloud Gateway项目中的WebFlux依赖 在处理Spring Cloud Gateway项目时,如果遇到`spring-boot-starter-webflux`与`sprin-boot-starter-web`之间的冲突问题[^1],通常建议保持两者之一以确保应用正常运行。然而,在某些情况下确实需要移除`webflux`依赖。 #### 解决方案概述 由于Spring Cloud Gateway本质上基于Reactive编程模型构建,完全移除其核心组件如WebFlux并不现实也不推荐。相反,应该调整项目的配置来适应特定需求: - **排除不必要的依赖**:当引入其他可能引起冲突的库时,应仔细审查POM文件或build.gradle文件,确保不会无意间加入不兼容版本的WebFlux或其他相关模块。 - **替换为Servlet模式**:虽然理论上可以尝试通过修改底层实现方式使Gateway运行于传统Servlet环境中,但这违背了官方设计初衷,并可能导致未知错误。因此这不是最佳实践。 对于希望继续使用Spring MVC而非WebFlux的情况,最合适的办法是从头创建一个新的非反应式的Spring Boot应用程序作为网关服务器,而不是试图改造现有的Spring Cloud Gateway实例。 #### 实际操作指南 假设仍然坚持要减少对WebFlux的直接引用,则可以通过以下方法间接达成目的: 1. 如果仅是为了避免自动装配多余的Bean而影响性能或者其他方面的影响,可以在application.properties中设置: ```properties spring.main.web-application-type=none ``` 2. 或者更彻底的方式是在pom.xml里显式地排除掉不需要的部分: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> <!-- 排除默认自带的 webflux --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </exclusion> </exclusions> </dependency> ``` 请注意上述做法可能会破坏部分功能特性,因为很多地方都紧密耦合着reactive stream的支持。所以务必充分测试改动后的效果再部署到生产环境当中去。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值