摘要:對于異步的請求,使用的是異步客戶端即。要實現(xiàn)的配置設(shè)計以及使用舉例要實現(xiàn)的配置設(shè)計以及使用舉例首先,我們要實現(xiàn)的,其包含三個重試重試的要在負(fù)載均衡之前,因為重試的時候,我們會從負(fù)載均衡器獲取另一個實例進(jìn)行重試,而不是在同一個實例上重試多次。
本系列代碼地址:https://github.com/JoJoTec/spring-cloud-parent
對于同步的請求,我們使用 spring-cloud-openfeign 封裝的 FeignClient,并做了額外的定制。對于異步的請求,使用的是異步 Http 客戶端即 WebClient。WebClient 使用也比較簡單,舉一個簡單的例子即:
//使用 WebClient 的 Builder 創(chuàng)建 WebClientWebClient client = WebClient.builder() //指定基址 .baseUrl("http://httpbin.org") //可以指定一些默認(rèn)的參數(shù),例如默認(rèn) Cookie,默認(rèn) HttpHeader 等等 .defaultCookie("cookieKey", "cookieValue") .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .build();
創(chuàng)建好 WebClient 后即可以使用這個 WebClient 進(jìn)行調(diào)用:
// GET 請求 /anything 并將 body 轉(zhuǎn)化為 StringMono stringMono = client.get().uri("/anything").retrieve().bodyToMono(String.class);//這里為了測試,采用阻塞獲取String block = stringMono.block();
返回的結(jié)果如下所示(請求 http://httporg.bin/anything 會將請求中的所有內(nèi)容原封不動返回,從這里我們可以看出上面測試的 Header 還有 cokkie 都被返回了):
{ "args": {}, "data": "", "files": {}, "form": {}, "headers": { "Accept": "*/*", "Accept-Encoding": "gzip", "Cookie": "TestCookie=TestCookieValue,getAnythingCookie=getAnythingCookieValue", "Getanythingheader": "getAnythingHeaderValue", "Host": "httpbin.org", "Testheader": "TestHeaderValue", "User-Agent": "ReactorNetty/1.0.7" }, "json": null, "method": "GET", "origin": "12.12.12.12", "url": "http://httpbin.org/anything"}
我們也可以加入負(fù)載均衡的功能,讓 WebClient 利用我們內(nèi)部的 LoadBalancer,負(fù)載均衡調(diào)用其他微服務(wù),首先注入負(fù)載均衡 Filter:
@AutowiredReactorLoadBalancerExchangeFilterFunction lbFunction;
創(chuàng)建 WebClient 的時候,將這個 Filter 加入:
//使用 WebClient 的 Builder 創(chuàng)建 WebClientWebClient client = WebClient.builder() //指定基址微服務(wù) .baseUrl("http://微服務(wù)名稱") //可以指定一些默認(rèn)的參數(shù),例如默認(rèn) Cookie,默認(rèn) HttpHeader 等等 .defaultCookie("cookieKey", "cookieValue") .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) //負(fù)載均衡器,改寫url .filter(lbFunction) .build();
這樣,這個 WebClient 就能調(diào)用微服務(wù)了。
但是,這樣還不能滿足我們的需求:
首先,我們要實現(xiàn)的 WebClient,其 Filter 包含三個:
ReactorLoadBalancerExchangeFilterFunction
需要重試的場景:
我們需要實現(xiàn)的配置方式是,通過這樣配置 application.yml
:
webclient: configs: //微服務(wù)名稱 testService1: //請求基址,第一級域名作為微服務(wù)名稱 baseUrl: http://testService1 //最多的 http 連接數(shù)量 maxConnection: 50 //連接超時 connectTimeout: 500ms //響應(yīng)超時 responseTimeout: 60s //除了 GET 方法外,哪些路徑還能重試 retryablePaths: - /retryable/** - /user/orders
加入這些配置,我們就能獲取載對應(yīng)微服務(wù)的 WebClient 的 Bean,例如:
//自動裝載 我們自定義的 WebClient 的 NamedContextFactory,這個是我們后面要實現(xiàn)的@Autowiredprivate WebClientNamedContextFactory webClientNamedContextFactory;//通過微服務(wù)名稱,獲取對應(yīng)的微服務(wù)調(diào)用的 WebClientwebClientNamedContextFactory.getWebClient("testService1");
接下來,我們會實現(xiàn)這些。
微信搜索“我的編程喵”關(guān)注公眾號,每日一刷,輕松提升技術(shù),斬獲各種offer:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/123997.html
摘要:將請求封裝成將請求封裝成的接口定義是但是最外層傳進(jìn)來的參數(shù)是和,需要將他們封裝成,這個工作就是在中做的。其實主要任務(wù)就是將各種參數(shù)封裝成除了和本次請求相關(guān)的和,還有會話管理器,編碼解碼器配置,國際化配置還有用于擴(kuò)展。本系列代碼地址:https://github.com/JoJoTec/spring-cloud-parent接下來,將進(jìn)入我們升級之路的又一大模塊,即網(wǎng)關(guān)模塊。網(wǎng)關(guān)模塊我們廢棄了...
摘要:在這里,會將上下文中載入的拼接成,然后調(diào)用其方法的,它是的處理請求業(yè)務(wù)的起點。添加相關(guān)依賴之后,會有這個。路由權(quán)重相關(guān)配置功能相關(guān)實現(xiàn)類,這個我們這里不關(guān)心。本系列代碼地址:https://github.com/JoJoTec/spring-cloud-parent我們繼續(xù)分析上一節(jié)提到的 WebHandler,經(jīng)過將請求封裝成 ServerWebExchange 的 HttpWebHand...
摘要:在這里,會將上下文中載入的拼接成,然后調(diào)用其方法的,它是的處理請求業(yè)務(wù)的起點。添加相關(guān)依賴之后,會有這個。路由權(quán)重相關(guān)配置功能相關(guān)實現(xiàn)類,這個我們這里不關(guān)心。 本系列代碼地址:??https://github.com/JoJoTec/spring-cloud-parent??我們繼續(xù)分析上一節(jié)提到的 ??WebHandle...
閱讀 3385·2021-11-22 09:34
閱讀 658·2021-11-19 11:29
閱讀 1357·2019-08-30 15:43
閱讀 2239·2019-08-30 14:24
閱讀 1871·2019-08-29 17:31
閱讀 1231·2019-08-29 17:17
閱讀 2621·2019-08-29 15:38
閱讀 2737·2019-08-26 12:10