1. 程式人生 > >Spring WebFlux特性

Spring WebFlux特性

Spring Boot 2.0 WebFlux 學習傳送門:https://blog.csdn.net/jeffli1993/article/details/79941175

特性一 非同步非阻塞

眾所周知,SpringMVC是同步阻塞的IO模型,資源浪費相對來說比較嚴重,當我們在處理一個比較耗時的任務時,例如:上傳一個比較大的檔案,首先,伺服器的執行緒一直在等待接收檔案,在這期間它就像個傻子一樣等在那兒(放學別走),什麼都幹不了,好不容易等到檔案來了並且接收完畢,我們又要將檔案寫入磁碟,在這寫入的過程中,這根執行緒又再次懵bi了,又要等到檔案寫完才能去幹其它的事情。這一前一後的等待,不浪費資源麼?

沒錯,Spring WebFlux就是來解決這問題的,Spring WebFlux可以做到非同步非阻塞。還是上面那上傳檔案的例子,Spring WebFlux是這樣做的:執行緒發現檔案還沒準備好,就先去做其它事情,當檔案準備好之後,通知這根執行緒來處理,當接收完畢寫入磁碟的時候(根據具體情況選擇是否做非同步非阻塞),寫入完畢後通知這根執行緒再來處理(非同步非阻塞情況下)。這個用腳趾頭都能看出相對SpringMVC而言,可以節省系統資源。666啊,有木有!

特性二 響應式(reactive)函式程式設計

如果你覺得java8的lambda寫起來很爽,那麼,你會再次喜歡上Spring WebFlux,因為它支援函數語言程式設計,得益於對於reactive-stream的支援(通過reactor框架來實現的),喜歡java8 stream的又有福了。為什麼要函數語言程式設計? 這個別問我,我也不知道,或許是因為bi格高吧,哈哈,開玩笑啦。

特性三 不再拘束於Servlet容器

以前,我們的應用都運行於Servlet容器之中,例如我們大家最為熟悉的Tomcat, Jetty...等等。而現在Spring WebFlux不僅能運行於傳統的Servlet容器中(前提是容器要支援Servlet3.1,因為非阻塞IO是使用了Servlet3.1的特性),還能執行在支援NIO的Netty和Undertow中。