文章目錄
- 概述
- 響應式Web框架Spring WebFlux
- 響應式數據訪問Spring Data Reactive
概述
https://spring.io/reactive
2017 年,Spring 發布了新版本 Spring 5, Spring 5 引入了很多核心功能,這其中重要的就是全面擁抱了響應式編程的設計思想和實踐。
Spring 5 的響應式編程模型以 Project Reactor
庫為基礎,而后者則實現了響應式流規范。事實上,Spring Boot 從 2.x 版本開始也是全面依賴 Spring 5。
針對響應式編程技術棧,有一點需要注意,即響應式編程并不是只針對系統中的某一部分組件,而是需要適用于調用鏈路上的所有組件。無論是 Web 層、服務層還是處于下游的數據訪問層,只要有一個環節不是響應式的,那么這個環節就會出現同步阻塞,從而導致響應式編程_02基本概念:背壓機制 Backpressure中所介紹的背壓機制無法生效。這就是所謂的全棧式響應式編程的設計理念。
因此,Spring 5 也針對響應式編程構建了全棧式的開發組件。對于常見的應用程序而言,Web 服務層和數據訪問層構成了最基本的請求鏈路。而 Spring 5 也提供了
- 針對 Web 服務層開發的響應式 Web 框架 WebFlux,
- 以及支持響應式數據訪問的 Spring Data Reactive 框架
響應式Web框架Spring WebFlux
在 Spring Boot 的基礎上,我們將引入全新的 Spring WebFlux 框架。WebFlux 框架名稱中的 Flux 一詞就來源于 Project Reactor 框架中的 Flux 組件。
WebFlux 功能非常強大,不僅包含了對創建和訪問響應式 HTTP 端點的支持,還可以用來實現服務器推送事件以及 WebSocket。
上圖針對傳統 spring-webmvc
技術棧和新型的 spring-webflux
技術棧做了一個對比。
我們從上往下看
-
位于最上層所提供的實際上是面向開發人員的開發模式,注意左上部分兩者存在一個交集,即
Spring WebFlux
既支持基于@Controller、@RequestMapping
等注解的傳統開發模式,又支持基于Router Functions
的函數式開發模式 -
關于框架背后的實現原理,傳統的 Spring MVC 構建在 Java EE 的 Servlet 標準之上,該標準本身就是阻塞和同步的。在最新版本的 Servlet 中雖然也添加了異步支持,但是在等待請求的過程中,Servlet 仍然在線程池中保持著線程。而 Spring WebFlux 則是構建在響應式流以及它的實現框架 Reactor 的基礎之上的一個開發框架,因此可以基于 HTTP 協議用來構建異步非阻塞的 Web 服務
-
最后,看一下位于底部的容器支持。顯然,Spring MVC 是運行在傳統的 Servlet 容器之上,而 Spring WebFlux 則需要支持異步的運行環境,比如
Netty、Undertow
以及Servlet 3.1
版本以上的Tomcat 和 Jetty
,因為在 Servlet 3.1 中引入了異步 I/O 支持
由于 WebFlux
提供了異步非阻塞的 I/O 特性,因此非常適合用來開發 I/O 密集型服務。而在使用 Spring MVC 就能滿足的場景下,就不需要更改為 WebFlux。通常,不大建議你將 WebFlux 和 Spring MVC 混合使用,因為這種開發方式顯然無法保證全棧式的響應式流。
響應式數據訪問Spring Data Reactive
Spring Data 是 Spring 家族中專門針對數據訪問而開發的一個框架,針對各種數據存儲媒介抽象了一批 Repository 接口以簡化開發過程。而在 Spring Data 的基礎上,Spring 5 也全面提供了一組響應式數據訪問模型。
在介紹如何使用 Spring Data 實現響應式數據訪問模型之前,我們再來看一下關于 Spring Boot 2 的另一張官網架構圖
可以看到,上圖底部明確把 Spring Data 劃分為兩大類型,
- 一類是支持 JDBC、JPA 和部分 NoSQL 的傳統 Spring Data Repository,
- 而另一類則是支持
Mongo、Cassandra、Redis、Couchbase
等的響應式Spring Data Reactive Repository