從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。