作者:微笑很純潔 
公衆號:純潔的微笑

Spring 5.0 中發佈了重量級組件 Webflux,拉起了響應式編程的規模使用序幕。

WebFlux 使用的場景是異步非阻塞的,使用 Webflux 作爲系統解決方案,在大多數場景下可以提高系統吞吐量。Spring Boot 2.0 是基於 Spring5 構建而成,因此 Spring Boot 2.X 將自動繼承了 Webflux 組件,本篇給大家介紹如何在 Spring Boot 中使用 Webflux 。

爲了方便大家理解,我們先來瞭解幾個概念。

響應式編程

在計算機中,響應式編程或反應式編程(英語:Reactive programming)是一種面向數據流和變化傳播的編程範式。這意味着可以在編程語言中很方便地表達靜態或動態的數據流,而相關的計算模型會自動將變化的值通過數據流進行傳播。

例如,在命令式編程環境中,a=b+c 表示將表達式的結果賦給 a,而之後改變 b 或 c 的值不會影響 a 。但在響應式編程中,a 的值會隨着 b 或 c 的更新而更新。

響應式編程是基於異步和事件驅動的非阻塞程序,只需要在程序內啓動少量線程擴展,而不是水平通過集羣擴展。

用大白話講,我們以前編寫的大部分都是阻塞類的程序,當一個請求過來時任務會被阻塞,直到這個任務完成後再返回給前端;響應式編程接到請求後只是提交了一個請求給後端,後端會再安排另外的線程去執行任務,當任務執行完成後再異步通知到前端。

Reactor

Java 領域的響應式編程庫中,最有名的算是 Reactor 了。Reactor 也是 Spring 5 中反應式編程的基礎,Webflux 依賴 Reactor 而構建。

Reactor 是一個基於 JVM 之上的異步應用基礎庫。爲 Java 、Groovy 和其他 JVM 語言提供了構建基於事件和數據驅動應用的抽象庫。Reactor 性能相當高,在最新的硬件平臺上,使用無堵塞分發器每秒鐘可處理 1500 萬事件。

簡單說,Reactor 是一個輕量級 JVM 基礎庫,幫助你的服務或應用高效,異步地傳遞消息。Reactor 中有兩個非常重要的概念 Flux 和 Mono 。

Flux 和 Mono

Flux 和 Mono 是 Reactor 中的兩個基本概念。Flux 表示的是包含 0 到 N 個元素的異步序列。在該序列中可以包含三種不同類型的消息通知:正常的包含元素的消息、序列結束的消息和序列出錯的消息。當消息通知產生時,訂閱者中對應的方法 onNext(), onComplete()和 onError()會被調用。

Mono 表示的是包含 0 或者 1 個元素的異步序列。該序列中同樣可以包含與 Flux 相同的三種類型的消息通知。Flux 和 Mono 之間可以進行轉換。對一個 Flux 序列進行計數操作,得到的結果是一個 Mono對象。把兩個 Mono 序列合併在一起,得到的是一個 Flux 對象。

WebFlux 是什麼?

WebFlux 模塊的名稱是 spring-webflux,名稱中的 Flux 來源於 Reactor 中的類 Flux。Spring webflux 有一個全新的非堵塞的函數式 Reactive Web 框架,可以用來構建異步的、非堵塞的、事件驅動的服務,在伸縮性方面表現非常好。

非阻塞的關鍵預期好處是能夠以小的固定數量的線程和較少的內存進行擴展。在服務器端 WebFlux 支持2種不同的編程模型:

  • 基於註解的 @Controller 和其他註解也支持 Spring MVC
  • Functional 、Java 8 lambda 風格的路由和處理


Spring Boot 中的響應式編程和 WebFlux 入門


如圖所示,WebFlux 模塊從上到下依次是 Router Functions、WebFlux、Reactive Streams 三個新組件。

  • Router Functions
  • 對標準的 @Controller,@RequestMapping 等的 Spring MVC 註解,提供一套 函數式風格的 API,用於創建 Router、Handler 和Filter。
  • WebFlux
  • 核心組件,協調上下游各個組件提供 響應式編程 支持。
  • Reactive Streams
  • 一種支持 背壓 (Backpressure) 的 異步數據流處理標準,主流實現有 RxJava 和 Reactor,Spring WebFlux 集成的是 Reactor。

默認情況下,Spring Boot 2 使用 Netty WebFlux,因爲 Netty 在異步非阻塞空間中被廣泛使用,異步非阻塞連接可以節省更多的資源,提供更高的響應度。通過比較 Servlet 3.1 非阻塞 I / O 沒有太多的使用,因爲使用它的成本比較高,Spring WebFlux 打開了一條實用的通路。

值得注意的是:支持 reactive 編程的數據庫只有 MongoDB, redis, Cassandra, Couchbase

Spring Webflux

Spring Boot 2.0 包括一個新的 spring-webflux 模塊。該模塊包含對響應式 HTTP 和 WebSocket 客戶端的支持,以及對 REST,HTML 和 WebSocket 交互等程序的支持。一般來說,Spring MVC 用於同步處理,Spring Webflux 用於異步處理。

Spring Boot Webflux 有兩種編程模型實現,一種類似 Spring MVC 註解方式,另一種是基於 Reactor 的響應式方式。

快速上手

添加 webflux 依賴

Spring Boot 中的響應式編程和 WebFlux 入門


Spring Boot 中的響應式編程和 WebFlux 入門


通過 IEDA 的依賴關係圖我們可以返現spring-boot-starter-webflux依賴於spring-webflux、Reactor 和 Netty 相關依賴包。

創建 Controller

Spring Boot 中的響應式編程和 WebFlux 入門

通過上面的示例可以發現,開發模式和之前 Spring Mvc 的模式差別不是很大,只是在方法的返回值上有所區別。

  • just() 方法可以指定序列中包含的全部元素。
  • 響應式編程的返回值必須是 Flux 或者 Mono ,兩者之間可以相互轉換。

測試類

Spring Boot 中的響應式編程和 WebFlux 入門

運行測試類,測試用例通過表示服務正常。啓動項目後,訪問地址:http://localhost:8080/hello,頁面返回信息:

Welcome to reactive world ~

證明 Webflux 集成成功。

以上便是 Spring Boot 集成 Webflux 最簡單的 Demo ,後續我們繼續研究 Webflux 的使用。

示例

全網最全的 Spring Boot 學習示例項目,擊下方鏈接即可獲取。

https://github.com/ityouknow/spring-boot-examples


擴展閱讀

介紹一下HTTP的響應結構

基於 Redis 的分佈式鎖

Spring boot集成RabbitMQ

spring boot 知識點整理

Spring Boot如何優雅的整合Mybatis

Java多線程編程—鎖優化

相關文章