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