Spring 5推出的一款特別優秀響應式Web框架Webflux詳解

泛函編程 硬件 Tomcat 程序員 程序員界的彭于晏 2019-05-24

我們知道傳統的Web框架,比如說:struts2,springmvc等都是基於Servlet API與Servlet容器基礎之上運行的,在Servlet3.1之後才有了異步非阻塞的支持。而WebFlux是一個典型非阻塞異步的框架,它的核心是基於Reactor的相關API實現的。相對於傳統的web框架來說,它可以運行在諸如Netty,Undertow及支持Servlet3.1的容器上,因此它的運行環境的可選擇行要比傳統web框架多的多。

根據官方的說法,webflux主要在如下兩方面體現出獨有的優勢:

1)非阻塞式

其實在servlet3.1提供了非阻塞的API,WebFlux提供了一種比其更完美的解決方案。使用非阻塞的方式可以利用較小的線程或硬件資源來處理併發進而提高其可伸縮性

2) 函數式編程端點

老生常談的編程方式了,Spring5必須讓你使用java8,那麼函數式編程就是java8重要的特點之一,而WebFlux支持函數式編程來定義路由端點處理請求。

二、SpringMVC與SpringWebFlux

我們先來看官網的一張圖:

Spring 5推出的一款特別優秀響應式Web框架Webflux詳解

它們都可以用註解式編程模型,都可以運行在tomcat,jetty,undertow等servlet容器當中。但是SpringMVC採用命令式編程方式,代碼一句一句的執行,這樣更有利於理解與調試,而WebFlux則是基於異步響應式編程,對於初次接觸的碼農們來說會不習慣。對於這兩種框架官方給出的建議是:

1)如果原先使用用SpringMVC好好的話,則沒必要遷移。因為命令式編程是編寫、理解和調試代碼的最簡單方法。因為老項目的類庫與代碼都是基於阻塞式的。

2)如果你的團隊打算使用非阻塞式web框架,WebFlux確實是一個可考慮的技術路線,而且它支持類似於SpringMvc的Annotation的方式實現編程模式,也可以在微服務架構中讓WebMvc與WebFlux共用Controller,切換使用的成本相當小

3)在SpringMVC項目裡如果需要調用遠程服務的話,你不妨考慮一下使用WebClient,而且方法的返回值可以考慮使用Reactive Type類型的,當每個調用的延遲時間越長,或者調用之間的相互依賴程度越高,其好處就越大

我個人意見是:官網明確指出,SpringWebFlux並不是讓你的程序運行的更快(相對於SpringMVC來說),而是在有限的資源下提高系統的伸縮性,因此當你對響應式編程非常熟練的情況下並將其應用於新的系統中,還是值得考慮的,否則還是老老實實的使用WebMVC吧

三、Reactive Spring Web

在這裡定義了最基本的服務端接口:HttpHandler和WebHandler

HttpHandler

HttpHandler定義了最基本的處理Http請求行為,這個接口主要作用是處理Http請求並將結果做出響應,下面這個表格是說明了Server API的使用方式及何種方式進行響應式流支持的:

WebHandler

WebHandler定義了Web請求必要一些處理行為,大家不妨想想看:WebFlux已經脫離了Servlet API,那麼使用WebFlux時遇到會話機制怎麼辦,想要對請求過濾處理怎麼辦或者想要處理靜態資源怎麼辦等等,那麼WebHandler就是做這個事情的。其實在HttpHandler的基本實現類通過適配器模式及裝飾模式也間接的實現了WebHandler接口:

Spring 5推出的一款特別優秀響應式Web框架Webflux詳解

WebHandler常見的實現類,我在這裡列舉一下:

WebHandlerDecorator:WebHandler的裝飾器,利用裝飾模式實現相關功能的擴展

HttpWebHandlerAdapter: 進行Http請求處理,同時也是HttpHandler的實現類

FilteringWebHandler:通過WebFilter進行過濾處理的類,類似於Servlet中的Filter

ExceptionHandlingWebHandler: 針對於異常的處理類

ResourceWebHandler:用於靜態資源請求的處理類

DispatcherHandler:請求的總控制器,類似於WebMVC中的DispatcherServlet

相關推薦

推薦中...