您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何在Spring Boot中使用Webflux”,在日常操作中,相信很多人在如何在Spring Boot中使用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
WebFlux 模塊的名稱是 spring-webflux,名稱中的 Flux 來源于 Reactor 中的類 Flux。Spring webflux 有一個全新的非堵塞的函數式 Reactive Web 框架,可以用來構建異步的、非堵塞的、事件驅動的服務,在伸縮性方面表現非常好。
非阻塞的關鍵預期好處是能夠以小的固定數量的線程和較少的內存進行擴展。在服務器端 WebFlux 支持2種不同的編程模型:
基于注解的 @Controller 和其他注解也支持 Spring MVC
Functional 、Java 8 lambda 風格的路由和處理
如圖所示,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 依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
通過 IEDA 的依賴關系圖我們可以返現spring-boot-starter-webflux
依賴于spring-webflux
、Reactor 和 Netty 相關依賴包。
創建 Controller
@RestController
public class HelloController {
@GetMapping("/hello")
public Mono<String> hello() {
return Mono.just("Welcome to reactive world ~");
}
}
通過上面的示例可以發現,開發模式和之前 Spring Mvc 的模式差別不是很大,只是在方法的返回值上有所區別。
just()
方法可以指定序列中包含的全部元素。
響應式編程的返回值必須是 Flux 或者 Mono ,兩者之間可以相互轉換。
測試類
@RunWith(SpringRunner.class)
@WebFluxTest(controllers = HelloController.class)
public class HelloTests {
@Autowired
WebTestClient client;
@Test
public void getHello() {
client.get().uri("/hello").exchange().expectStatus().isOk();
}
}
運行測試類,測試用例通過表示服務正常。啟動項目后,訪問地址:http://localhost:8080/hello
,頁面返回信息:
Welcome to reactive world ~
證明 Webflux 集成成功。
到此,關于“如何在Spring Boot中使用Webflux”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。