springboot 学习之路 18(webflux详细介绍(2))
webflux的詳細介紹
引言:上一節已經簡單介紹webflux的一些基本概念,本章繼續學習webflux的原理和實戰方面的東西:
Spring WebFlux架構:
note:注意理解上面這張圖。下面解釋引用百度
1)服務端技術棧
Spring提供了完整的支持響應式的服務端技術棧。
如上圖所示,左側為基于spring-webmvc的技術棧,右側為基于spring-webflux的技術棧,
Spring WebFlux是基于響應式流的,因此可以用來建立異步的、非阻塞的、事件驅動的服務。它采用Reactor作為首選的響應式流的實現庫,不過也提供了對RxJava的支持。
由于響應式編程的特性,Spring WebFlux和Reactor底層需要支持異步的運行環境,比如Netty和Undertow;也可以運行在支持異步I/O的Servlet 3.1的容器之上,比如Tomcat(8.0.23及以上)和Jetty(9.0.4及以上)。
從圖的縱向上看,spring-webflux上層支持兩種開發模式:
類似于Spring WebMVC的基于注解(@Controller、@RequestMapping)的開發模式;
Java 8 lambda 風格的函數式開發模式。
Spring WebFlux也支持響應式的Websocket服務端開發。
由此看來,Spring WebFlux與Vert.x有一些相通之處,都是建立在非阻塞的異步I/O和事件驅動的基礎之上的。
2)響應式Http客戶端
此外,Spring WebFlux也提供了一個響應式的Http客戶端API WebClient。它可以用函數式的方式異步非阻塞地發起Http請求并處理響應。其底層也是由Netty提供的異步支持。
我們可以把WebClient看做是響應式的RestTemplate,與后者相比,前者:
是非阻塞的,可以基于少量的線程處理更高的并發;
可以使用Java 8 lambda表達式;
支持異步的同時也可以支持同步的使用方式;
可以通過數據流的方式與服務端進行雙向通信。
當然,與服務端對應的,Spring WebFlux也提供了響應式的Websocket客戶端API。
springboot_webflux demo案例:
根據上面原理圖 webflux的實現有兩版,一是基于springmvc,一種基于響應式流的,,下面我來逐一介紹一下:(需要學習的盡量跟著我的步驟走,我會把出錯的地方標出)
基礎部分搭建(不管哪種實現,都需要項目準備工作):
第一步:引入項目依賴,我后期會演示mongodb的操作,這次一下把依賴都引入:
第二步:把allpication.yml 的mongodb配置上,
從webflux開始,我的demo采用yaml語法的配置文件來講解,前面采用的都是properties文件,是為了大家方便入門,后期我采用application.yml文件,
補充:配置文件的優先順序: 項目路徑下/conf/ > 項目路徑下/ > /resources/conf/ > resources/ ( properties后綴優先 yml文件的加載順序)
1>注解式:
1>> 只是為了測試,直接寫測試控制器了,實戰中應該從Handler中獲取
2>> 啟動springboot項目:
是netty啟動,上節介紹過,webflux是響應式框架,默認是netty啟動(可以改tomcat toncat8以后已經支持響應式了)
請求測試如下:
Netty是一套異步的、事件驅動的網絡應用程序框架和工具,能夠開發高性能、高可靠性的網絡服務器和客戶端程序,因此與同樣是異步的、事件驅動的響應式編程范式吻合。
在Java 7推出異步I/O庫,以及Servlet3.1增加了對異步I/O的支持之后,Tomcat等Servlet容器也隨后開始支持異步I/O,然后Spring WebMVC也增加了對Reactor庫的支持,
所以上邊如果不是將spring-boot-starter-web替換為spring-boot-starter-WebFlux,而是增加reactor-core的依賴的話,仍然可以用注解的方式開發基于Tomcat的響應式應用。
注解式就簡單介紹一下,重點在響應式開發,webflux是響應式框架,我會著重介紹一下響應式開發的步驟。注解式只是spring團隊為了更好的遷移而提供給大家的,因為我們都是用上面那種開發方式開發代碼
2>webflux的響應式開發:
響應式開發主要在handler和route上,handler相當于我們原來使用的 server | controller 官方定義是處理,就是寫邏輯代碼的地方,而route相當于RequestMapping() 相當于配置映射的地方,官方定義是路由
2.1>測試handler如下: (方法應該從數據獲取數據進行返回,我只是做測試,就用打印時間代替了)
2.2> 編輯route
2.3>啟動,測試:
在WebFlux中,請求和響應不再是WebMVC中的ServletRequest和ServletResponse,而是ServerRequest和ServerResponse。后者是在響應式編程中使用的接口,它們提供了對非阻塞和回壓特性的支持,以及Http消息體與響應式類型Mono和Flux的轉換方法。
注意:到這,webflux的響應式開發配置基本搭建完畢,后面會繼續介紹mongodb的操作
webflux操作mongodb:
webflux不支持mysql, 使用mongodb來進行演示 (mongodb配置已經在準備時配置進去了)
第一步:創建實體User
在這個mongodb的啟動后,會自動在對應的mongodb中創建一個user集合,名字就是實體類名稱小寫。
第二步:dao實現:
note:與非響應式Spring Data的CrudReposity對應的,響應式的Spring Data也提供了相應的Repository庫:ReactiveCrudReposity,當然,我們也可以使用它的子接口ReactiveMongoRepository。
ReactiveCrudRepository的泛型分別是User和ID的類型;
第三步:UserHandler(邏輯處理代碼)
第四步:webFlux的注解實現controller: 方便大家上手 ( 響應式后期再說:)
最后啟動測試即可:
截圖不放了。下面我介紹幾個問題點:
問題:
1> 怎么驗證響應式流:
啟動測試就可以發現查詢所用是一個一個出來的,而不是一下返回。
異步 阻塞的概念還需要大家理解,這是服務端大效果演示,還有一種客戶端的演示,待下節介紹
總結
以上是生活随笔為你收集整理的springboot 学习之路 18(webflux详细介绍(2))的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windbg命令学习2(!sym和.re
- 下一篇: 黑镜第五季在线观看