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