日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

springcloud ribbon retryTemplate操作流程分析

發布時間:2025/3/19 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springcloud ribbon retryTemplate操作流程分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、在配置中加入

<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId> </dependency>

二、初始化流程分析

1.構建LoadBalancedRetryFactory,在RibbonAutoConfiguration配置類中。

2.在LoadBalancerAutoConfiguration中構建LoadBalancerRequestFactory負載均衡請求工廠, 以及RetryLoadBalancerInterceptor,并設置在RestTemplate中。

?

?三、調用流程分析

1.還是進入RestTemplate.execute方法,

這里的request還是?InterceptingClientHttpRequest

2.進入攔截器調用,這里的攔截器為?RetryLoadBalancerInterceptor

3.RetryTemplate的interrupt方法, 這里先創建一個重試策略,就是判斷當前是否可重試。

package org.springframework.cloud.client.loadbalancer;/*** @author Ryan Baxter* @author Will Tran* @author Gang Li*/ public class RetryLoadBalancerInterceptor implements ClientHttpRequestInterceptor {@Overridepublic ClientHttpResponse intercept(final HttpRequest request, final byte[] body,final ClientHttpRequestExecution execution) throws IOException {final URI originalUri = request.getURI();final String serviceName = originalUri.getHost();Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);final LoadBalancedRetryPolicy retryPolicy = lbRetryFactory.createRetryPolicy(serviceName,loadBalancer);RetryTemplate template = createRetryTemplate(serviceName, request, retryPolicy);return template.execute(context -> {ServiceInstance serviceInstance = null;if (context instanceof LoadBalancedRetryContext) {LoadBalancedRetryContext lbContext = (LoadBalancedRetryContext) context;serviceInstance = lbContext.getServiceInstance();}if (serviceInstance == null) {serviceInstance = loadBalancer.choose(serviceName);}ClientHttpResponse response = RetryLoadBalancerInterceptor.this.loadBalancer.execute(serviceName, serviceInstance,requestFactory.createRequest(request, body, execution));int statusCode = response.getRawStatusCode();if (retryPolicy != null && retryPolicy.retryableStatusCode(statusCode)) {byte[] bodyCopy = StreamUtils.copyToByteArray(response.getBody());response.close();throw new ClientHttpResponseStatusCodeException(serviceName, response, bodyCopy);}return response;}, new LoadBalancedRecoveryCallback<ClientHttpResponse, ClientHttpResponse>() {//This is a special case, where both parameters to LoadBalancedRecoveryCallback are//the same. In most cases they would be different.@Overrideprotected ClientHttpResponse createResponse(ClientHttpResponse response, URI uri) {return response;}});}

4.首先創建RetryTemplate,這里面主要綁定InterceptorRetryPolicy攔截器重試策略。

?

5.攔截器重試策略包含了RibbonLoadBalacedRetryPolicy和一個服務實例選擇器。RibbonLoadBalancerClient.

?6.接著真正執行RetryTemplate.execute方法。一個重試回調,一個恢復回調。

@Override public final <T, E extends Throwable> T execute(RetryCallback<T, E> retryCallback,RecoveryCallback<T> recoveryCallback) throws E {return doExecute(retryCallback, recoveryCallback, null); }

?7.RetryTemplate的doExecute方法,首先判斷是否可重試,可以就調用retryCallback.doWithRetry(context),

org.springframework.retry.support.RetryTemplateprotected <T, E extends Throwable> T doExecute(RetryCallback<T, E> retryCallback,RecoveryCallback<T> recoveryCallback, RetryState state)throws E, ExhaustedRetryException {RetryPolicy retryPolicy = this.retryPolicy;BackOffPolicy backOffPolicy = this.backOffPolicy;// Allow the retry policy to initialise itself...RetryContext context = open(retryPolicy, state);RetrySynchronizationManager.register(context);Throwable lastException = null;boolean exhausted = false;try {// Give clients a chance to enhance the context...boolean running = doOpenInterceptors(retryCallback, context);while (canRetry(retryPolicy, context) && !context.isExhaustedOnly()) {try {lastException = null;return retryCallback.doWithRetry(context);}catch (Throwable e) {lastException = e;try {registerThrowable(retryPolicy, state, context, e);}catch (Exception ex) {throw new TerminatedRetryException("Could not register throwable",ex);}finally {doOnErrorInterceptors(retryCallback, context, e);}if (canRetry(retryPolicy, context) && !context.isExhaustedOnly()) {try {backOffPolicy.backOff(backOffContext);}catch (BackOffInterruptedException ex) {throw ex;}}if (this.logger.isDebugEnabled()) {this.logger.debug("Checking for rethrow: count=" + context.getRetryCount());}if (shouldRethrow(retryPolicy, context, state)) {if (this.logger.isDebugEnabled()) {this.logger.debug("Rethrow in retry for policy: count="+ context.getRetryCount());}throw RetryTemplate.<E>wrapIfNecessary(e);}}}exhausted = true;return handleRetryExhausted(recoveryCallback, context, state);}catch (Throwable e) {throw RetryTemplate.<E>wrapIfNecessary(e);}finally {close(retryPolicy, context, state, lastException == null || exhausted);doCloseInterceptors(retryCallback, context, lastException);RetrySynchronizationManager.clear();}}

8.這里首先為當前請求創建RetryContext,實現類為LoadBalancedRetryContext

9.判斷是否可以重試接口,判斷重試次數是否為0。

?

?10.接著調用重試函數,又回到RetryLoadBalancerInterceptor。

11.這里的LoadBalancer為RibbonLoadBalanceClient,并且requestFactory.createRequest為之前未重試時普通的HTTP請求類。

ClientHttpResponse response = RetryLoadBalancerInterceptor.this.loadBalancer.execute(serviceName, serviceInstance,requestFactory.createRequest(request, body, execution));

?12.LoadBalancerRequestFactory.createRequest又跳到InterceptingRequestExecution這個責任鏈執行器中。

?13.由于這種普通的REQUEST,沒有攔截器,直接調用HTTP請求對象替換實例URL中為真實服務實例域名,然后執行HTTP請求。

?14.請求接口超時,被RetryTemplate.doExecute方法捕獲異常,然后繼續獲取下一個實例重試。?

?

?

這里對retryCnt加1.?

下面重新選擇一個實例,進行設置到context

接著又判斷是否可重試。

?

然后嘗試下一個節點,重新調用retryCallback函數。

?

重新請求成功。

?

攔截器執行完畢,返回成功。注意這個重試攔截器沒有調用execution.interrupt,所以不會再執行責任鏈的下一個HANDLER.

?

?最后處理結果,進行數據轉換,返回數據。

?返回結果完畢。

?

總結

以上是生活随笔為你收集整理的springcloud ribbon retryTemplate操作流程分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费的毛片网站 | 国产网站久久 | 日批免费在线观看 | 欧美一区二区三区视频 | 98久久 | 亚一区二区 | 好色av| 熟女肥臀白浆大屁股一区二区 | 欧美变态口味重另类 | 亚洲美女操 | 成a人片亚洲日本久久 | 我的邻居在线观看 | 中文字幕人妻一区二区在线视频 | 欧美双性人妖o0 | 亚洲色吧 | 亚洲视频日韩 | 日韩综合在线视频 | av观看在线免费 | 人妻精品久久久久中文 | 嫩草影院久久 | 无码免费一区二区三区 | √天堂资源地址在线官网 | 久久成人福利视频 | 欧美在线观看视频一区二区 | 免费观看黄色av | 三上悠亚中文字幕在线播放 | 人妻精品无码一区二区三区 | 九色视频丨porny丨丝袜 | 亚洲视频在线观看免费视频 | 色校园| 国产欧美精品久久久 | 亚洲无码精品免费 | 亚洲国产精品成人综合在线 | 欧美一区二不卡视频 | 操极品女神 | 国产免费一区二区视频 | 色偷偷噜噜噜亚洲男人的天堂 | 李丽珍毛片 | 久久91亚洲人成电影网站 | 成人性生交大片免费看96 | 不卡日韩 | 亚洲国产成人在线视频 | 99久久婷婷国产综合精品草原 | www.夜夜爽| 777视频在线观看 | 永久免费av | 国产黄色小说 | 日韩精品免费一区二区三区 | 成人福利在线 | 伊人99在线 | 欧美日韩人妻精品一区在线 | 99综合网| 欧美黄片一区二区三区 | 成人影片在线免费观看 | 免看一级a毛片一片成人不卡 | 一本色道久久综合亚洲 | 欧美丝袜一区二区三区 | 麻豆国产一区二区三区四区 | 姑娘第5集高清在线观看 | 97人妻精品一区二区三区免费 | 少妇人妻邻居 | 亚洲精品国产精品乱码不卡√香蕉 | 婷婷开心激情 | 在线观看欧美亚洲 | 黄色a一片 | 海角社区id:1220.7126,10. | 国产特级淫片免费看 | 国产婷 | 岛国片免费在线观看 | 亚洲第一av网站 | 成人无码久久久久毛片 | 欧美激情视频一区二区三区在线播放 | 性做久久久久久久久久 | 亚洲三级在线看 | 国产在线视频自拍 | 国产女主播av | 怡红院精品视频 | 姑娘第5集在线观看免费 | 超碰pron| 国产三级视频网站 | 少妇免费毛片久久久久久久久 | 一区二区三区高清在线观看 | 日韩欧美一区二区一幕 | 国产精品福利一区 | 99热在线国产 | 波多野结衣在线视频免费观看 | 国语精品久久 | 男人插女人视频网站 | 国产午夜精品一区二区 | 人操人视频 | 天天操天天干天天舔 | 懂色av蜜臀av粉嫩av | 国产福利电影在线 | 污污网址在线观看 | 四虎国产在线 | 亚洲视频网站在线观看 | 有码一区二区 | 公交上高潮的丁芷晴 | 欧美色射 |