从SPRING 5开始,spring webflux 就作为spring mvc的替代者出现在了spring framework中。它支持响应式栈编程,基于 Reactive Streams API ,可以作为web应用运行在非阻塞服务器上(netty,Undertow、servlet 3.1+)。
spring webflux 除了是一个web framework,也是一个webclient用来执行http请求,也是一个WebTestClient用来测试 web endpoints,同时也支持websocket。
为什么要提供一个新的web framework呢?这是因为从servlet3.1开始支持非阻塞请求,可以达到一个线程同时处理多个请求的效果,这样就减少了服务器资源的占用。再加上为了更好的支持java8的函数式api,像CompletableFuture和ReactiveX这样的非阻塞apis也越来越受欢迎。
Reactor是spring webflux的响应式工具包中的一个选择,它提供了工作在像0...1 和 0...N 这样的数据序列通过一系列操作来匹配ReactiveX vocabulary of operators 的 Mono 和 Flux 类型的api。
Reactor 对于webflux来说是一个核心的依赖,但也可以和其他响应式工具包互通,比如Reactive Streams。作为一个普遍的规则,webflux接收一个普通的Publisher作为输入,在内部适配成Reactor类型,使用它,最后返回Mono、Flux这样的作为输出。所以你可以通过任何Publisher作为输入,然后通过一系列操作作为输出,但是当你需要使用其他的响应式工具包时要对输出做好适配。作为一个可行的方案,webflux可以适配像RxJava这样的其他的响应式库。想了解更多请见:Reactive Libraries。
在编程模型上,spring webflux支持两种编程模式:
Annotated Controllers :和spring mvc保持一致,可以使用同样的注解的。
Functional Endpoints : 基于lambda、轻量级、函数式编程模型。可以认为一个应用可以使用一个小的库或者一系列工具来路由和处理请求。和annotated controllers 比有一个大的不同点,它是应用来掌控一个请求从处理开始到结束整个过程,而annotated controllers 是通过注解来声明一个意图以及被调回。
那么该选择spring mvc还是 spring webflux呢?
如果你现在的spring mvc应用工作的很好,那就不需要改变。命令式的编程在写、理解、debug上是容易的。
如果你已经购买了一个非阻塞的web栈,spring flux的优势在于提供了一个同样的执行模型,并且还支持多种容器以及编程模型。
如果你有兴趣通过java8 lambda、kotlin来构造一个轻量级的函数式的web应用,那么就可以采用Spring WebFlux functional web endpoints。它的优势在于透明化和可控制性在为微服务和小应用这样的复杂的需求。
在spring boot 2中,WebFlux 默认使用netty作为server。