您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何在Spring Boot中使用Webflux”,在日常操作中,相信很多人在如何在Spring Boot中使用Webflux問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何在Spring Boot中使用Webflux”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
為了方便大家理解,我們先來(lái)了解幾個(gè)概念。
在計(jì)算機(jī)中,響應(yīng)式編程或反應(yīng)式編程(英語(yǔ):Reactive programming)是一種面向數(shù)據(jù)流和變化傳播的編程范式。這意味著可以在編程語(yǔ)言中很方便地表達(dá)靜態(tài)或動(dòng)態(tài)的數(shù)據(jù)流,而相關(guān)的計(jì)算模型會(huì)自動(dòng)將變化的值通過(guò)數(shù)據(jù)流進(jìn)行傳播。
例如,在命令式編程環(huán)境中,a=b+c 表示將表達(dá)式的結(jié)果賦給 a,而之后改變 b 或 c 的值不會(huì)影響 a 。但在響應(yīng)式編程中,a 的值會(huì)隨著 b 或 c 的更新而更新。
響應(yīng)式編程是基于異步和事件驅(qū)動(dòng)的非阻塞程序,只需要在程序內(nèi)啟動(dòng)少量線(xiàn)程擴(kuò)展,而不是水平通過(guò)集群擴(kuò)展。
用大白話(huà)講,我們以前編寫(xiě)的大部分都是阻塞類(lèi)的程序,當(dāng)一個(gè)請(qǐng)求過(guò)來(lái)時(shí)任務(wù)會(huì)被阻塞,直到這個(gè)任務(wù)完成后再返回給前端;響應(yīng)式編程接到請(qǐng)求后只是提交了一個(gè)請(qǐng)求給后端,后端會(huì)再安排另外的線(xiàn)程去執(zhí)行任務(wù),當(dāng)任務(wù)執(zhí)行完成后再異步通知到前端。
Reactor
Java 領(lǐng)域的響應(yīng)式編程庫(kù)中,最有名的算是 Reactor 了。Reactor 也是 Spring 5 中反應(yīng)式編程的基礎(chǔ),Webflux 依賴(lài) Reactor 而構(gòu)建。
Reactor 是一個(gè)基于 JVM 之上的異步應(yīng)用基礎(chǔ)庫(kù)。為 Java 、Groovy 和其他 JVM 語(yǔ)言提供了構(gòu)建基于事件和數(shù)據(jù)驅(qū)動(dòng)應(yīng)用的抽象庫(kù)。Reactor 性能相當(dāng)高,在最新的硬件平臺(tái)上,使用無(wú)堵塞分發(fā)器每秒鐘可處理 1500 萬(wàn)事件。
簡(jiǎn)單說(shuō),Reactor 是一個(gè)輕量級(jí) JVM 基礎(chǔ)庫(kù),幫助你的服務(wù)或應(yīng)用高效,異步地傳遞消息。Reactor 中有兩個(gè)非常重要的概念 Flux 和 Mono 。
Flux 和 Mono
Flux 和 Mono 是 Reactor 中的兩個(gè)基本概念。Flux 表示的是包含 0 到 N 個(gè)元素的異步序列。在該序列中可以包含三種不同類(lèi)型的消息通知:正常的包含元素的消息、序列結(jié)束的消息和序列出錯(cuò)的消息。當(dāng)消息通知產(chǎn)生時(shí),訂閱者中對(duì)應(yīng)的方法 onNext(), onComplete()和 onError()會(huì)被調(diào)用。
Mono 表示的是包含 0 或者 1 個(gè)元素的異步序列。該序列中同樣可以包含與 Flux 相同的三種類(lèi)型的消息通知。Flux 和 Mono 之間可以進(jìn)行轉(zhuǎn)換。對(duì)一個(gè) Flux 序列進(jìn)行計(jì)數(shù)操作,得到的結(jié)果是一個(gè) Mono
WebFlux 模塊的名稱(chēng)是 spring-webflux,名稱(chēng)中的 Flux 來(lái)源于 Reactor 中的類(lèi) Flux。Spring webflux 有一個(gè)全新的非堵塞的函數(shù)式 Reactive Web 框架,可以用來(lái)構(gòu)建異步的、非堵塞的、事件驅(qū)動(dòng)的服務(wù),在伸縮性方面表現(xiàn)非常好。
非阻塞的關(guān)鍵預(yù)期好處是能夠以小的固定數(shù)量的線(xiàn)程和較少的內(nèi)存進(jìn)行擴(kuò)展。在服務(wù)器端 WebFlux 支持2種不同的編程模型:
基于注解的 @Controller 和其他注解也支持 Spring MVC
Functional 、Java 8 lambda 風(fēng)格的路由和處理
如圖所示,WebFlux 模塊從上到下依次是 Router Functions、WebFlux、Reactive Streams 三個(gè)新組件。
Router Functions
對(duì)標(biāo)準(zhǔn)的 @Controller,@RequestMapping 等的 Spring MVC 注解,提供一套 函數(shù)式風(fēng)格的 API,用于創(chuàng)建 Router、Handler 和Filter。
WebFlux
核心組件,協(xié)調(diào)上下游各個(gè)組件提供 響應(yīng)式編程 支持。
Reactive Streams
一種支持 背壓 (Backpressure) 的 異步數(shù)據(jù)流處理標(biāo)準(zhǔn),主流實(shí)現(xiàn)有 RxJava 和 Reactor,Spring WebFlux 集成的是 Reactor。
默認(rèn)情況下,Spring Boot 2 使用 Netty WebFlux,因?yàn)?Netty 在異步非阻塞空間中被廣泛使用,異步非阻塞連接可以節(jié)省更多的資源,提供更高的響應(yīng)度。通過(guò)比較 Servlet 3.1 非阻塞 I / O 沒(méi)有太多的使用,因?yàn)槭褂盟某杀颈容^高,Spring WebFlux 打開(kāi)了一條實(shí)用的通路。
值得注意的是:支持 reactive 編程的數(shù)據(jù)庫(kù)只有 MongoDB, redis, Cassandra, Couchbase
Spring Webflux
Spring Boot 2.0 包括一個(gè)新的 spring-webflux 模塊。該模塊包含對(duì)響應(yīng)式 HTTP 和 WebSocket 客戶(hù)端的支持,以及對(duì) REST,HTML 和 WebSocket 交互等程序的支持。一般來(lái)說(shuō),Spring MVC 用于同步處理,Spring Webflux 用于異步處理。
Spring Boot Webflux 有兩種編程模型實(shí)現(xiàn),一種類(lèi)似 Spring MVC 注解方式,另一種是基于 Reactor 的響應(yīng)式方式。
添加 webflux 依賴(lài)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
通過(guò) IEDA 的依賴(lài)關(guān)系圖我們可以返現(xiàn)spring-boot-starter-webflux
依賴(lài)于spring-webflux
、Reactor 和 Netty 相關(guān)依賴(lài)包。
創(chuàng)建 Controller
@RestController
public class HelloController {
@GetMapping("/hello")
public Mono<String> hello() {
return Mono.just("Welcome to reactive world ~");
}
}
通過(guò)上面的示例可以發(fā)現(xiàn),開(kāi)發(fā)模式和之前 Spring Mvc 的模式差別不是很大,只是在方法的返回值上有所區(qū)別。
just()
方法可以指定序列中包含的全部元素。
響應(yīng)式編程的返回值必須是 Flux 或者 Mono ,兩者之間可以相互轉(zhuǎn)換。
測(cè)試類(lèi)
@RunWith(SpringRunner.class)
@WebFluxTest(controllers = HelloController.class)
public class HelloTests {
@Autowired
WebTestClient client;
@Test
public void getHello() {
client.get().uri("/hello").exchange().expectStatus().isOk();
}
}
運(yùn)行測(cè)試類(lèi),測(cè)試用例通過(guò)表示服務(wù)正常。啟動(dòng)項(xiàng)目后,訪(fǎng)問(wèn)地址:http://localhost:8080/hello
,頁(yè)面返回信息:
Welcome to reactive world ~
證明 Webflux 集成成功。
到此,關(guān)于“如何在Spring Boot中使用Webflux”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。