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的泛型分別是UserID的類型;

    

  第三步:UserHandler(邏輯處理代碼)

    

  第四步:webFlux的注解實現controller: 方便大家上手 ( 響應式后期再說:)

    

  最后啟動測試即可:

    截圖不放了。下面我介紹幾個問題點: 


問題: 

  1>  怎么驗證響應式流:

    

    啟動測試就可以發現查詢所用是一個一個出來的,而不是一下返回。

 


 

 異步 阻塞的概念還需要大家理解,這是服務端大效果演示,還有一種客戶端的演示,待下節介紹


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM