引言:上一節已經簡單介紹webflux的一些基本概念,本章繼續學習webflux的原理和實戰方面的東西:mysql
Spring WebFlux架構:react
note:注意理解上面這張圖。下面解釋引用百度web
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。
根據上面原理圖 webflux的實現有兩版,一是基於springmvc,一種基於響應式流的,,下面我來逐一介紹一下:(須要學習的儘可能跟着個人步驟走,我會把出錯的地方標出)spring
基礎部分搭建(無論哪一種實現,都須要項目準備工做):sql
第一步:引入項目依賴,我後期會演示mongodb的操做,此次一下把依賴都引入:mongodb
第二步:把allpication.yml 的mongodb配置上,編程
從webflux開始,個人demo採用yaml語法的配置文件來說解,前面採用的都是properties文件,是爲了你們方便入門,後期我採用application.yml文件,
補充:配置文件的優先順序: 項目路徑下/conf/ > 項目路徑下/ > /resources/conf/ > resources/ ( properties後綴優先 yml文件的加載順序)
1>> 只是爲了測試,直接寫測試控制器了,實戰中應該從Handler中獲取tomcat
2>> 啓動springboot項目:springboot
是netty啓動,上節介紹過,webflux是響應式框架,默認是netty啓動(能夠改tomcat toncat8之後已經支持響應式了)服務器
請求測試以下:
Netty是一套異步的、事件驅動的網絡應用程序框架和工具,可以開發高性能、高可靠性的網絡服務器和客戶端程序,所以與一樣是異步的、事件驅動的響應式編程範式吻合。
在Java 7推出異步I/O庫,以及Servlet3.1增長了對異步I/O的支持以後,Tomcat等Servlet容器也隨後開始支持異步I/O,而後Spring WebMVC也增長了對Reactor庫的支持,
因此上邊若是不是將替換爲,而是增長的依賴的話,仍然能夠用註解的方式開發基於Tomcat的響應式應用。spring-boot-starter-webspring-boot-starter-WebFluxreactor-core
註解式就簡單介紹一下,重點在響應式開發,webflux是響應式框架,我會着重介紹一下響應式開發的步驟。註解式只是spring團隊爲了更好的遷移而提供給你們的,由於咱們都是用上面那種開發方式開發代碼
響應式開發主要在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不支持mysql, 使用mongodb來進行演示 (mongodb配置已經在準備時配置進去了)
第一步:建立實體User
在這個mongodb的啓動後,會自動在對應的mongodb中建立一個user集合,名字就是實體類名稱小寫。
第二步:dao實現:
note:與非響應式Spring Data的CrudReposity
對應的,響應式的Spring Data也提供了相應的Repository庫:ReactiveCrudReposity
,固然,咱們也可使用它的子接口ReactiveMongoRepository
。
ReactiveCrudRepository
的泛型分別是User
和ID
的類型;
第三步:UserHandler(邏輯處理代碼)
第四步:webFlux的註解實現controller: 方便你們上手 ( 響應式後期再說:)
最後啓動測試便可:
截圖不放了。下面我介紹幾個問題點:
1> 怎麼驗證響應式流:
啓動測試就能夠發現查詢所用是一個一個出來的,而不是一下返回。
異步 阻塞的概念還須要你們理解,這是服務端大效果演示,還有一種客戶端的演示,待下節介紹