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;