您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關響應式非阻塞IO與基礎用法是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
RestTemplate
作為spring-web項目的一部分,在Spring 3.0版本開始被引入。根據Spring官方文檔及源碼中的介紹,RestTemplate在將來的版本中它可能會被棄用, 作為替代,Spring官方已在Spring 5中引入了WebClient作為非阻塞式Reactive HTTP客戶端。
在開始為大家介紹webClient之前有必要為大家介紹一下響應式非阻塞IO與傳統IO之前的區別。我們先留下一個問題:webClient發送與接收單個HTTP請求比RestTemplate更快么?答案是否定的。 看到這里有的同學已經蒙了,既然webClient沒有更快,那官方為什么還推薦使用它?聽我往下講。
筆者用相對通俗的話為大家說明一下阻塞IO與非阻塞IO之間的區別。我們以軟件開發團隊的工作方式來做一個比喻。作為軟件開發人員,我們肯定知道軟件開發的基本流程:
項目立項與可行性研究
需求分析與設計
代碼開發
迭代測試
上線及配置管理、運維
在以Spring MVC或者struct為代表的框架都是基于sevlet的,其底層IO模型是阻塞IO模型。這種模型就好像你是公司的一個開發人員,上面的所有的5項工作全都由你一個人完成。如果公司有10個人,最多就只能同時進行10個需求。客戶需求增多了也沒有辦法,只能讓他們等著。如下圖:一個請求占用一個線程,當線程池內的線程都被占用后新來的請求就只能等待。
spring 社區為了解決Spring MVC的阻塞模型在高并發場景下的性能瓶頸的問題,推出了Spring WebFlux,WebFlux底層實現是久經考驗的netty非阻塞IO通信框架。該框架的請求處理與線程交互關系圖如下:
boosGroup用于Accetpt連接建立事件并分發請求, workerGroup用于處理I/O讀寫事件。netty我就不細說了,還是用通俗的方式給大家講一下:如果通俗的將上圖中的各個任務池、線程池的組合比做一個軟件開發公司,那么:
項目立項及可研,由公司項目經理及顧問來完成
需求分析與設計,由產品經理和架構師來完成
代碼研發,由項目經理帶領開發人員來完成
迭代測試,由測試團隊來完成
上線及配置管理、運維,可能由專門的devops團隊來完成
這樣一個公司內的所有人完成分工,就能在有限的資源的情況下,去接觸更多的客戶,談更多的需求,合理的分配人力資源,達到并發處理能力最大化的極限水平。相比于一個員工從頭到位的負責一個項目,它的組織性更強,分工更明確,合理的利用空閑資源,專業的人最專業的事。
這種人力資源的合理利用及組織方式和非阻塞IO模型有異曲同工之處,通過合理的將請求處理線程及任務進行分類,合理的利用系統的內存、CPU資源,達到單位時間內處理能力的最大化就是異步非阻塞IO的核心用意! 回到上文給大家留下的問題,webClient處理單個HTTP請求的響應時長并不比RestTemplate更快,但是它處理并發的能力更強。所以響應式非阻塞IO模型的核心意義在于:提高了單位時間內有限資源下的服務請求的并發處理能力,而不是縮短了單個服務請求的響應時長。
上文為大家介紹完IO模型之后,我想大家已經可以明白了。與RestTemplate相比,WebClient優勢如下:
非阻塞響應式IO,單位時間內有限資源下支持更高的并發量
支持使用Java 8 lambda表達式函數
同時支持同步、異步與Streaming流式傳輸場景
使用WebClient需要引入如下的Jar(可以在包含spring-boot-starter-web
的Spring Boot項目中引入)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency>
那么問題又來了,熟悉Spring 開發的朋友應該都知道。spring-boot-starter-webflux和spring-boot-starter-web代表的是兩套技術棧
spring-boot-starter-web可以實現目前比較成熟的基于servlet技術棧的Spring Boot應用
spring-boot-starter-webflux可以實現的是底層基于netty的響應式編程的技術棧的Spring Boot應用
二者可以共存么?答案是:
作為服務端實現Spring Boot應用而言,二者在應用角度當然是不能共存的。截止20200820我寫稿的時間,如果在一個項目里面將二者都引入了,開發服務端應用其實使用的還是spring-boot-starter-web的基于servlet的技術棧。
作為HTTP客戶端而言,如果我們只是要使用WebClient。無論怎樣,引入spring-boot-starter-webflux
就對了。
創建WebClient有如下三種方式,我們來一一為大家介紹。
WebClient.create()
WebClient.create(String baseUrl)
:指定了baseUrl,使用該客戶端發送請求都基于baseUrl
WebClient.builder()
返回一個WebClient.Builder,該對象可以做鏈式調用,傳遞更多的參數。
為了方便后續開發測試,首先介紹一個網站給大家。JSONPlaceholder是一個提供免費的在線REST API的網站,我們在開發時可以使用它提供的url地址測試下網絡請求以及請求參數。或者當我們程序需要獲取一些模擬數據、模擬圖片時也可以使用它。
WebClient.create()
創建WebClient發送GET請求,接收String類型單個Mono對象(Mono英文:單聲道、單體)。
public class SimpleTest { [@Test](https://my.oschina.net/azibug) void testSimple() { WebClient webClient = WebClient.create(); Mono<String> mono = webClient .get() // 發送GET 請求 .uri("http://jsonplaceholder.typicode.com/posts/1") // 請求路徑 .retrieve() // 獲取響應結果 .bodyToMono(String.class); //響應數據類型轉換 System.out.println("=====" + mono.block()); } }
mono.block()方法仍然是阻塞式的數據響應接收方式,響應式的編程方法我們后面文章會為大家介紹。
WebClient.create(String baseUrl)
上面使用create()無參方法,在指定請求uri時每次都要指定完整的HTTP服務路徑,如"http://jsonplaceholder.typicode.com/posts/1"。使用WebClient.create(String baseUrl)
可以統一指定一個baseUrl,這樣請求指定請求uri時,可以省略baseUrl部分,如"/posts/1"。
private WebClient webClient = WebClient.create("http://jsonplaceholder.typicode.com"); [@Test](https://my.oschina.net/azibug) void testBaseUrl(){ Mono<String> mono = webClient .get() .uri("/posts/1") // 請求路徑,注意省略了baseurl部分 .retrieve() .bodyToMono(String.class); System.out.println("=====" + mono.block()); }
上面代碼請求結果,和4.1結果是一樣的
WebClient.builder()
使用builder()創建WebClient對象,可以一次性傳遞的參數內容就更加豐富了。cookies、headers等信息都可以使用builder來傳遞。 場景:比如你請求的服務端使用JWT token,每次請求都需要傳遞token。如果每次請求都單獨去創建一個WebClient,然后指定Token,那就麻煩了。我們可以使用builder在WebClient實例化的時候,統一設置Token。
private WebClient webClient = WebClient .builder() .defaultHeader("JWT-Token", "xxxyyy3fsfsfsff-fjdskfa") .build();
支持的可選配置如下:
uriBuilderFactory
: 自定義UriBuilderFactory靈活配置使用Url
defaultHeader
: 為HTTP請求設置Headers請求頭
defaultCookie
: 為HTTP請求設置Cookies
defaultRequest
: 自定義Http Request
filter
: 為HTTP請求增加客戶端過濾器
exchangeStrategies
: HTTP 讀寫信息自定義
clientConnector
: HTTP客戶端連接器設置
上述就是小編為大家分享的響應式非阻塞IO與基礎用法是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。