Spring-webflux简介
spring-webflux是spring在5.0版本后提供的一套响应式编程风格的web开发框架,大量测评证明,使用WebFlux开发接口能够大幅提升接口的吞吐量。
这个框架包含了spring-framework和spring mvc,它可以运行在Netty、Undertow以及3.1版本以上的Serlvet容器上。你可以在项目中同时使用spring-webmvc和spring-webflux,或者只用其中一个来开发web应用。
什么是“响应式”
所谓响应式,举个例子,当调用一个api获取数据时,无需阻塞等待数据返回,而是当有数据返回时会进行告知。可见响应式是非阻塞的,意味着调用方法后,CPU可以去做别的事情,当接收到数据响应时CPU再回来处理,这种方式提高了系统的吞吐量。
而响应式编程,其实是为这种异步非阻塞的流式编程制定的一套标准。流式编程已不陌生了,Java8提供的stream api就是这种风格。这套标准包括对运行环境(JVM、JavaScript)以及网络协议相关的规范。
Spring-webflux的响应式API
Spring-webflux框架是基于Reactor这个开源项目开发的。Reactor框架是跟Spring紧密配合的。
它提供了两种API类型,分别是Mono和Flux;
// Mono一般作用于单个对象
Mono<Person> person = personDao.getPerson(personId);
// Flux一般作用于多个对象
Flux<Person> people = personDao.listAllPeople();
尽管webflux框架基于Reactor,它也能与其他的响应式框架同时使用,比如RxJava。
选择Spring-webmvc还是Spring-webflux呢
这两个web框架分别代表着两种不同类型的编程流派,官方给出了一个图作为对比如下
根据官方的建议有以下几点可以作为参考:
- 如果你已经使用了Spring-webmvc进行开发,并且项目运行良好,就无需更改了;何况现在大多数的三方库都是阻塞的,并不能发挥出非阻塞的优势。
- webflux提供了相当多的选择;在服务层,可以使用(Netty, Tomcat, Jetty, Undertow,
和3.1版本以上的Servlet容器)作为web服务;在应用层,可以选择用@Controller定义还是使用函数编程定义;在编程风格上,可以选择用Reactor、RxJava或其他。 - 如果你钟爱Java8提供的lambda表达式这种轻量级、函数式的编程风格,那么建议选择用webflux;同时对于一些轻量级应用,或者复杂度比较低的微服务,建议使用webflux以便更好的进行控制。
- 在微服务架构中,可以将webmvc和webflux项目混合使用。两个框架都可以使用@Controller这种注解的方式,使得项目的重用更加容易。
- 评估一个项目是否应该选择webflux的最简单的方式是,依据项目中是否会使用很多的阻塞API,比如JDBC或者一些阻塞式的API就不适用与webflux项目。
- 如果一个webmvc项目中有很多的外部系统调用,可以试试响应式的WebClient,它能直接从Controller的方法中返回响应式结果。
- 响应式编程的学习路线是比较陡峭的,所以如果你身在一个大型的团队中,要考虑投入的成本;不过可以用用WebClient来体验下响应式编程。
Spring-webflux不仅可以支持在Tomcat、Jetty以及3.1版本以上的Servlet容器上,还能够运行在非Servlet的服务器之上,比如Netty、Undertow等。
使用Springboot构建一个webflux应用,默认就是使用Netty,因为Netty本身就是非阻塞式的实现。