1. 程式人生 > >springboot 2.0 教程-11-WebFlux框架體驗

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
關注公眾號 檢視更多技術乾貨
還可加群 , 眾多好基友在等你
mpjpg

springboot 書籍 PDF 下載

掃描關注上方公眾號
回覆關鍵字 boot
就可以下載這本書了
書籍的排版很好的,我自己也在看.大家可以一起交流哦
1_png

寫在前面

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 的模式 降低 資料量大造成的伺服器壓力和傳輸阻塞

這個可以參看我視訊中的例子

一點感悟

  1. 容易接入 , springmvc 不用學 就可以遷移過來

  2. 結合netty , 非同步非阻塞 事件驅動

  3. java8 新特性 lambda表示式 stream模型等

  4. 因為不支援stream的 資料庫事務 所以 mysql 目前不支援 reactive, 只有 mongo , redis 等 Nosql 資料庫 支援reactive

  5. 客戶端 webclient,配合起來更加簡便

結束語

如果大家對於這裡比較感興趣的話

可以去B站檢視我的視訊講解

https://space.bilibili.com/193580090/#/

或者是在 github下載原始碼

https://github.com/ibywind/springboot-learn