Spring webflux--響應式、非阻塞、事件驅型web框架
一、基本概念---阻塞(Blocking I/O)/非阻塞(Non-blocking I/O),同步(Synchronous I/O)/非同步(Asynchronous I/O):
在進行網路程式設計時,我們常常見到同步(Synchronous I/O)/非同步(Asynchronous I/O),阻塞(Blocking I/O)/非阻塞(Non-blocking I/O)四種呼叫方式,下面將這幾個基本概念解釋一下:
1. 同步/非同步:【主要針對C端】
所謂同步,就是在C端發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。
例如普通B/S模式(同步):提交請求--->等待伺服器處理--->處理完畢返回。 整個期間客戶端瀏覽器不能幹任何事。
而非同步的概念和同步相對,當C端一個非同步過程呼叫發起後,呼叫者不能立刻得到結果。實際處理這個呼叫的部件在完成後,通過狀態、通知和回撥來通知呼叫者。
例如:ajax請求(非同步):請求通過事件觸發--->伺服器處理(這是瀏覽器仍然可以作其他事情)--->處理完畢。
2. 阻塞/非阻塞:【主要針對S端】
阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起(執行緒進入非可執行狀態,在這個狀態下,cpu不會給執行緒分配時間片,即執行緒暫停執行)。函式只有在得到結果之後才會返回。
有人也許會把阻塞呼叫和同步呼叫等同起來,實際上他是不同的。對於同步呼叫來說,很多時候當前執行緒還是啟用的,只是從邏輯上當前函式沒有返回而已。 例如,我們在socket中呼叫recv函式,如果緩衝區中沒有資料,這個函式就會一直等待,直到有資料才返回。而此時,當前執行緒還會繼續處理各種各樣的訊息。
快遞的例子:比如到你某個時候到A樓一層(假如是核心緩衝區)取快遞,但是你不知道快遞什麼時候過來,你又不能幹別的事,只能死等著。但你可以睡覺(程序處於休眠狀態),因為你知道快遞把貨送來時一定會給你打個電話(假定一定能叫醒你)。
非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函式不會阻塞當前執行緒,而會立刻返回。
還是等快遞的例子:如果用忙輪詢的方法,每隔5分鐘到A樓一層(核心緩衝區)去看快遞來了沒有。如果沒來,立即返回。而快遞來了,就放在A樓一層,等你去取。
二、響應式宣言
不知道是不是為了向敏捷宣言致敬,響應式宣言中也包含了4組關鍵詞:
-
Responsive: 可響應的。要求系統儘可能做到在任何時候都能及時響應。
-
Resilient: 可恢復的。要求系統即使出錯了,也能保持可響應性。
-
Elastic: 可伸縮的。要求系統在各種負載下都能保持可響應性。
-
Message Driven: 訊息驅動的。要求系統通過非同步訊息連線各個元件。
可以看到,對於任何一個響應式系統,首先要保證的就是可響應性,否則就稱不上是響應式系統。從這個意義上來說,動不動就藍屏的Windows系統顯然不是一個響應式系統。
左側是傳統的基於Servlet的Spring Web MVC框架,右側是5.0版本新引入的基於Reactive Streams的Spring WebFlux框架,從上到下依次是Router Functions,WebFlux,Reactive Streams三個新元件。
-
Router Functions: 對標@Controller,@RequestMapping等標準的Spring MVC註解,提供一套函式式風格的API,用於建立Router,Handler和Filter。
-
WebFlux: 核心元件,協調上下游各個元件提供響應式程式設計支援。
-
Reactive Streams: 一種支援背壓(Backpressure)的非同步資料流處理標準,主流實現有RxJava和Reactor,Spring WebFlux預設整合的是Reactor。
在Web容器的選擇上,Spring WebFlux既支援像Tomcat,Jetty這樣的的傳統容器(前提是支援Servlet 3.1 Non-Blocking IO API),又支援像Netty,Undertow那樣的非同步容器。不管是何種容器,Spring WebFlux都會將其輸入輸出流適配成Flux<DataBuffer>格式,以便進行統一處理。
值得一提的是,除了新的Router Functions介面,Spring WebFlux同時支援使用老的Spring MVC註解宣告Reactive Controller。和傳統的MVC Controller不同,Reactive Controller操作的是非阻塞的ServerHttpRequest和ServerHttpResponse,而不再是Spring MVC裡的HttpServletRequest和HttpServletResponse。
三、Spring 5 - Spring webflux
它是一個新的非堵塞函式式 Reactive Web 框架,可以用來建立非同步的,非阻塞,事件驅動的服務,並且擴充套件性非常好。把阻塞(不可避免的)風格的程式碼遷移到函式式的非阻塞 Reactive 風格程式碼。
-
新的spring-webflux模組,一個基於reactive的spring-webmvc,完全的非同步非阻塞,旨在使用enent-loop執行模型和傳統的執行緒池模型。
-
Reactive說明在spring-core比如編碼和解碼
-
spring-core相關的基礎設施,比如Encode 和Decoder可以用來編碼和解碼資料流;DataBuffer 可以使用java ByteBuffer或者Netty ByteBuf;ReactiveAdapterRegistry可以對相關的庫提供傳輸層支援。
-
在spring-web包裡包含HttpMessageReade和HttpMessageWrite
Java學習資料(複製下段連結至瀏覽器即可)
data:textml;charset=UTF-8;base64,5oGt5Zac5L2g77yM5p625p6E5biI5a2m5Lmg576k5Y+35pivNjg2NTc5MDE0Cg==