亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

SpringCloud升級(jí)之路2020.0.x版-37. 實(shí)現(xiàn)異步的客戶端封裝配置管理的意義與設(shè)計(jì)

fxp / 725人閱讀

摘要:對(duì)于異步的請(qǐng)求,使用的是異步客戶端即。要實(shí)現(xiàn)的配置設(shè)計(jì)以及使用舉例要實(shí)現(xiàn)的配置設(shè)計(jì)以及使用舉例首先,我們要實(shí)現(xiàn)的,其包含三個(gè)重試重試的要在負(fù)載均衡之前,因?yàn)橹卦嚨臅r(shí)候,我們會(huì)從負(fù)載均衡器獲取另一個(gè)實(shí)例進(jìn)行重試,而不是在同一個(gè)實(shí)例上重試多次。

本系列代碼地址:https://github.com/JoJoTec/spring-cloud-parent

為何需要封裝異步 HTTP 客戶端 WebClient

對(duì)于同步的請(qǐng)求,我們使用 spring-cloud-openfeign 封裝的 FeignClient,并做了額外的定制。對(duì)于異步的請(qǐng)求,使用的是異步 Http 客戶端即 WebClient。WebClient 使用也比較簡單,舉一個(gè)簡單的例子即:

//使用 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 后即可以使用這個(gè) WebClient 進(jìn)行調(diào)用:

// GET 請(qǐng)求 /anything 并將 body 轉(zhuǎn)化為 StringMono stringMono = client.get().uri("/anything").retrieve().bodyToMono(String.class);//這里為了測試,采用阻塞獲取String block = stringMono.block();

返回的結(jié)果如下所示(請(qǐng)求 http://httporg.bin/anything 會(huì)將請(qǐng)求中的所有內(nèi)容原封不動(dòng)返回,從這里我們可以看出上面測試的 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 的時(shí)候,將這個(gè) 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();

這樣,這個(gè) WebClient 就能調(diào)用微服務(wù)了。

但是,這樣還不能滿足我們的需求:

  1. 需要在 WebClient 加入像 Feignclient 里面加的類似的重試與斷路機(jī)制,線程隔離就不需要了,因?yàn)槎际钱惒秸?qǐng)求不會(huì)阻塞任務(wù)線程。
  2. 需要針對(duì)不同的微服務(wù)配置不同的連接超時(shí)以及響應(yīng)超時(shí)來適應(yīng)不同微服務(wù)。
  3. 這些配置都增加了代碼的復(fù)雜度,我們需要減少這些代碼對(duì)于業(yè)務(wù)的侵入性,最好能通過純配置實(shí)現(xiàn)這些 WebClient 的初始化。

要實(shí)現(xiàn)的配置設(shè)計(jì)以及使用舉例

首先,我們要實(shí)現(xiàn)的 WebClient,其 Filter 包含三個(gè):

  1. 重試 Filter:重試的 Filter 要在負(fù)載均衡 Filter 之前,因?yàn)橹卦嚨臅r(shí)候,我們會(huì)從負(fù)載均衡器獲取另一個(gè)實(shí)例進(jìn)行重試,而不是在同一個(gè)實(shí)例上重試多次。
  2. 負(fù)載均衡 Filter,其實(shí)就是內(nèi)置的 ReactorLoadBalancerExchangeFilterFunction
  3. 斷路器 Filter:斷路器需要在負(fù)載均衡之后,因?yàn)橹挥胸?fù)載均衡之后才能拿到具體本地調(diào)用的服務(wù)實(shí)例,這樣我們才能實(shí)現(xiàn)基于微服務(wù)實(shí)例方法級(jí)別的斷路器。

需要重試的場景:

  1. 非 2xx 的響應(yīng)碼返回,并且方法是可以重試的方法。如何定義方法是可以重試的,首先 GET 方法是可以重試的,對(duì)于其他方法,根據(jù)配置中的是否配置了這個(gè) URL 可以重試決定。
  2. 異常重試
    1. 連接異常:例如連接超時(shí),連接中斷等等,所有請(qǐng)求的連接異常都可以重試,因?yàn)檎?qǐng)求并沒有發(fā)出去。
    2. 斷路器異常:該服務(wù)實(shí)例方法級(jí)別的斷路器打開了,需要直接重試其他實(shí)例,因?yàn)檎?qǐng)求并沒有發(fā)出去。
    3. 響應(yīng)超時(shí)異常:這個(gè)重試邏輯和非 2xx 的響應(yīng)碼返回一樣。

我們需要實(shí)現(xiàn)的配置方式是,通過這樣配置 application.yml

webclient:  configs:    //微服務(wù)名稱    testService1:      //請(qǐng)求基址,第一級(jí)域名作為微服務(wù)名稱      baseUrl: http://testService1      //最多的 http 連接數(shù)量      maxConnection: 50      //連接超時(shí)      connectTimeout: 500ms      //響應(yīng)超時(shí)      responseTimeout: 60s      //除了 GET 方法外,哪些路徑還能重試      retryablePaths:        - /retryable/**        - /user/orders

加入這些配置,我們就能獲取載對(duì)應(yīng)微服務(wù)的 WebClient 的 Bean,例如:

//自動(dòng)裝載 我們自定義的 WebClient 的 NamedContextFactory,這個(gè)是我們后面要實(shí)現(xiàn)的@Autowiredprivate WebClientNamedContextFactory webClientNamedContextFactory;//通過微服務(wù)名稱,獲取對(duì)應(yīng)的微服務(wù)調(diào)用的 WebClientwebClientNamedContextFactory.getWebClient("testService1");

接下來,我們會(huì)實(shí)現(xiàn)這些。

微信搜索“我的編程喵”關(guān)注公眾號(hào),每日一刷,輕松提升技術(shù),斬獲各種offer

?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/123997.html

相關(guān)文章

  • SpringCloud升級(jí)之路2020.0.x-41. SpringCloudGateway 基本

    摘要:將請(qǐng)求封裝成將請(qǐng)求封裝成的接口定義是但是最外層傳進(jìn)來的參數(shù)是和,需要將他們封裝成,這個(gè)工作就是在中做的。其實(shí)主要任務(wù)就是將各種參數(shù)封裝成除了和本次請(qǐng)求相關(guān)的和,還有會(huì)話管理器,編碼解碼器配置,國際化配置還有用于擴(kuò)展。本系列代碼地址:https://github.com/JoJoTec/spring-cloud-parent接下來,將進(jìn)入我們升級(jí)之路的又一大模塊,即網(wǎng)關(guān)模塊。網(wǎng)關(guān)模塊我們廢棄了...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • SpringCloud升級(jí)之路2020.0.x-41. SpringCloudGateway 基本

    摘要:在這里,會(huì)將上下文中載入的拼接成,然后調(diào)用其方法的,它是的處理請(qǐng)求業(yè)務(wù)的起點(diǎn)。添加相關(guān)依賴之后,會(huì)有這個(gè)。路由權(quán)重相關(guān)配置功能相關(guān)實(shí)現(xiàn)類,這個(gè)我們這里不關(guān)心。本系列代碼地址:https://github.com/JoJoTec/spring-cloud-parent我們繼續(xù)分析上一節(jié)提到的 WebHandler,經(jīng)過將請(qǐng)求封裝成 ServerWebExchange 的 HttpWebHand...

    不知名網(wǎng)友 評(píng)論0 收藏0
  • SpringCloud升級(jí)之路2020.0.x-41. SpringCloudGateway 基本

    摘要:在這里,會(huì)將上下文中載入的拼接成,然后調(diào)用其方法的,它是的處理請(qǐng)求業(yè)務(wù)的起點(diǎn)。添加相關(guān)依賴之后,會(huì)有這個(gè)。路由權(quán)重相關(guān)配置功能相關(guān)實(shí)現(xiàn)類,這個(gè)我們這里不關(guān)心。 本系列代碼地址:??https://github.com/JoJoTec/spring-cloud-parent??我們繼續(xù)分析上一節(jié)提到的 ??WebHandle...

    番茄西紅柿 評(píng)論0 收藏2637

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<