springboot 2.0 教程-11-WebFlux框架體驗
閱讀原文:https://blog.bywind.cn/articles/2018/11/28/1543373589258.html
視訊教程:https://www.bilibili.com/video/av35595465
課程原始碼:https://github.com/ibywind/springboot-learn
關注公眾號 檢視更多技術乾貨
還可加群 , 眾多好基友在等你
springboot 書籍 PDF 下載
掃描關注上方公眾號
回覆關鍵字 boot
就可以下載這本書了
書籍的排版很好的,我自己也在看.大家可以一起交流哦
寫在前面
hello 大家好
歡迎大家收看御風大世界
本次課是
springboot 系列教程第11課
我將為大家演示
springboot WebFlux框架整合
webflux 是什麼?
我們知道傳統的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支援函數語言程式設計來定義路由端點處理請求。
MVC VS 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吧
springboot 整合webflux
springboot 整合webflux其實很簡單
而且 我們熟悉spirngmvc的 同學其實不必太多的學習成本
就可以很快的遷移到webflux中
我們這裡演示從一個新的專案開始吧
首先我們依賴的 web 模組
然後我們演示 遷移到webflux
如果你直接想用webflux 可以按照下圖直接引入
我們首先使用傳統的springmvc
這個過程很簡單
訪問也是通暢的
現在我們把現有的 springmvc 改造成 webflux 的模式
pom 很簡單, 剛才的web改成webflux就可以了
如果你的專案中 同時存在mvc和webflux的話
springboot會優先路由到mvc 所以我們就直接改變了
然後我們什麼都不做 直接啟動專案
我們可以看到我們的專案啟動在 netty伺服器上面 而不是 tomcat
埠預設是 8080
接著我們 訪問 路徑
我們得到了相同的結果
springmvc 遷移到 webflux 只需要修改下依賴
其他的地方你不需要做任何的變更
學習成本減到最低
給spring 一個贊
雖然我們只修改了少量的程式碼,但是其實這個簡單的專案已經脫胎換骨了。整個技術棧從命令式的、同步阻塞的【spring-webmvc + servlet + Tomcat】變成了響應式的、非同步非阻塞的【spring-webflux + Reactor + Netty】。
同時在寫法上面
你可以選擇繼續沿用 springmvc的那一套程式設計正規化
同時也可以
選擇如下的程式設計模式
handler 和 router 模式
handler 其實就是controller中具體的方法
而 router 其實即使 requestmapping 定義一個URI
大家可以參看我的視訊
然後 我們產出的話 需要 使用 Mono(處理單個物件或void) 和 Flux (處理集合物件)
並且可以使用 stream 的模式 降低 資料量大造成的伺服器壓力和傳輸阻塞
這個可以參看我視訊中的例子
一點感悟
-
容易接入 , springmvc 不用學 就可以遷移過來
-
結合netty , 非同步非阻塞 事件驅動
-
java8 新特性 lambda表示式 stream模型等
-
因為不支援stream的 資料庫事務 所以 mysql 目前不支援 reactive, 只有 mongo , redis 等 Nosql 資料庫 支援reactive
-
客戶端 webclient,配合起來更加簡便
結束語
如果大家對於這裡比較感興趣的話
可以去B站檢視我的視訊講解
https://space.bilibili.com/193580090/#/
或者是在 github下載原始碼