日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring Cloud Gateway重試機制原理解析

瀏覽:132日期:2023-08-21 15:37:58

重試,我相信大家并不陌生。在我們調用Http接口的時候,總會因為某種原因調用失敗,這個時候我們可以通過重試的方式,來重新請求接口。

生活中這樣的事例很多,比如打電話,對方正在通話中啊,信號不好啊等等原因,你總會打不通,當你第一次沒打通之后,你會打第二次,第三次…第四次就通了。

重試也要注意應用場景,讀數據的接口比較適合重試的場景,寫數據的接口就需要注意接口的冪等性了。還有就是重試次數如果太多的話會導致請求量加倍,給后端造成更大的壓力,設置合理的重試機制才是最關鍵的。今天我們來簡單的了解下Spring Cloud Gateway中的重試機制和使用。

使用講解

RetryGatewayFilter是Spring Cloud Gateway對請求重試提供的一個GatewayFilter Factory。

配置方式:

spring: cloud: gateway: routes: - id: fsh-house uri: lb://fsh-house predicates: - Path=/house/** filters: - name: Retry args: retries: 3 series: - SERVER_ERROR statuses: - OK methods: - GET - POST exceptions: - java.io.IOException

配置講解

配置類源碼:org.springframework.cloud.gateway.filter.factory.RetryGatewayFilterFactory.RetryConfig:

public static class RetryConfig { private int retries = 3; private List<Series> series = toList(Series.SERVER_ERROR); private List<HttpStatus> statuses = new ArrayList<>(); private List<HttpMethod> methods = toList(HttpMethod.GET); private List<Class<? extends Throwable>> exceptions = toList(IOException.class); // .....}

retries:重試次數,默認值是3次

series:狀態碼配置(分段),符合的某段狀態碼才會進行重試邏輯,默認值是SERVER_ERROR,值是5,也就是5XX(5開頭的狀態碼),共有5個值:

public enum Series { INFORMATIONAL(1), SUCCESSFUL(2), REDIRECTION(3), CLIENT_ERROR(4), SERVER_ERROR(5);}

statuses:狀態碼配置,和series不同的是這邊是具體狀態碼的配置,取值請參考:org.springframework.http.HttpStatus

methods:指定哪些方法的請求需要進行重試邏輯,默認值是GET方法,取值如下:

public enum HttpMethod { GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE;}

exceptions:指定哪些異常需要進行重試邏輯,默認值是java.io.IOException

代碼測試

就寫個接口,在接口中記錄請求次數,然后拋出一個異常模擬500,通過網關訪問這個接口,如果你配置了重試次數是3,那么接口中會輸出4次結果才是對的,證明重試生效了。

AtomicInteger ac = new AtomicInteger();@GetMapping('/data')public HouseInfo getData(@RequestParam('name') String name) { if (StringUtils.isBlank(name)) { throw new RuntimeException('error'); } System.err.println(ac.addAndGet(1)); return new HouseInfo(1L, '上海', '虹口', 'XX小區');}

源碼欣賞

@Overridepublic GatewayFilter apply(RetryConfig retryConfig) { // 驗證重試配置格式是否正確 retryConfig.validate(); Repeat<ServerWebExchange> statusCodeRepeat = null; if (!retryConfig.getStatuses().isEmpty() || !retryConfig.getSeries().isEmpty()) { Predicate<RepeatContext<ServerWebExchange>> repeatPredicate = context -> { ServerWebExchange exchange = context.applicationContext(); // 判斷重試次數是否已經達到了配置的最大值 if (exceedsMaxIterations(exchange, retryConfig)) {return false; } // 獲取響應的狀態碼 HttpStatus statusCode = exchange.getResponse().getStatusCode(); // 獲取請求方法類型 HttpMethod httpMethod = exchange.getRequest().getMethod(); // 判斷響應狀態碼是否在配置中存在 boolean retryableStatusCode = retryConfig.getStatuses().contains(statusCode); if (!retryableStatusCode && statusCode != null) { // null status code might mean a network exception?// try the seriesretryableStatusCode = retryConfig.getSeries().stream() .anyMatch(series -> statusCode.series().equals(series)); } // 判斷方法是否包含在配置中 boolean retryableMethod = retryConfig.getMethods().contains(httpMethod); // 決定是否要進行重試 return retryableMethod && retryableStatusCode; }; statusCodeRepeat = Repeat.onlyIf(repeatPredicate).doOnRepeat(context -> reset(context.applicationContext())); } //TODO: support timeout, backoff, jitter, etc... in Builder Retry<ServerWebExchange> exceptionRetry = null; if (!retryConfig.getExceptions().isEmpty()) { Predicate<RetryContext<ServerWebExchange>> retryContextPredicate = context -> { if (exceedsMaxIterations(context.applicationContext(), retryConfig)) {return false; } // 異常判斷 for (Class<? extends Throwable> clazz : retryConfig.getExceptions()) { if (clazz.isInstance(context.exception())) { return true;} } return false; }; // 使用reactor extra的retry組件 exceptionRetry = Retry.onlyIf(retryContextPredicate).doOnRetry(context -> reset(context.applicationContext())).retryMax(retryConfig.getRetries()); } return apply(statusCodeRepeat, exceptionRetry);}public boolean exceedsMaxIterations(ServerWebExchange exchange, RetryConfig retryConfig) { Integer iteration = exchange.getAttribute(RETRY_ITERATION_KEY); //TODO: deal with null iteration return iteration != null && iteration >= retryConfig.getRetries();}public void reset(ServerWebExchange exchange) { //TODO: what else to do to reset SWE? exchange.getAttributes().remove(ServerWebExchangeUtils.GATEWAY_ALREADY_ROUTED_ATTR);}public GatewayFilter apply(Repeat<ServerWebExchange> repeat, Retry<ServerWebExchange> retry) { return (exchange, chain) -> { if (log.isTraceEnabled()) { log.trace('Entering retry-filter'); } // chain.filter returns a Mono<Void> Publisher<Void> publisher = chain.filter(exchange)//.log('retry-filter', Level.INFO).doOnSuccessOrError((aVoid, throwable) -> { // 獲取已經重試的次數,默認值為-1 int iteration = exchange.getAttributeOrDefault(RETRY_ITERATION_KEY, -1); // 增加重試次數 exchange.getAttributes().put(RETRY_ITERATION_KEY, iteration + 1);}); if (retry != null) { // retryWhen returns a Mono<Void> // retry needs to go before repeat publisher = ((Mono<Void>)publisher).retryWhen(retry.withApplicationContext(exchange)); } if (repeat != null) { // repeatWhen returns a Flux<Void> // so this needs to be last and the variable a Publisher<Void> publisher = ((Mono<Void>)publisher).repeatWhen(repeat.withApplicationContext(exchange)); } return Mono.fromDirect(publisher); };}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产欧美一区二区三区精品酒店| 丝袜美腿一区二区三区| 日本亚洲视频| 日本少妇精品亚洲第一区| 青青国产91久久久久久| 国产精品久久乐| 青青草伊人久久| 国产午夜久久av| 国产中文欧美日韩在线 | 中文字幕一区二区三区四区久久| 亚洲一区有码| 欧美日韩黄网站| 国产美女久久| 美女福利一区二区三区| 一区在线免费| 91成人福利| 电影91久久久| 99久久99视频只有精品| 在线日韩成人| 国产精品密蕾丝视频下载| 日韩1区2区日韩1区2区| 欧美精品中文| 91综合网人人| 91国语精品自产拍| 欧美日韩亚洲一区三区| 国产中文在线播放| 日韩欧美午夜| 日韩欧美中文字幕在线视频| 国产精品原创| 国产午夜精品一区二区三区欧美| 涩涩涩久久久成人精品| 国产精品一区免费在线| 99精品小视频| 欧美欧美黄在线二区| 亚洲精品在线影院| 免费在线观看一区二区三区| 美女视频黄久久| 夜夜嗨av一区二区三区网站四季av| 国产精品久一| 亚洲专区欧美专区| 高清日韩欧美| 日韩精品欧美成人高清一区二区| 日韩黄色大片| 欧美亚洲网站| 免费日韩av| 亚洲午夜天堂| 国产日韩中文在线中文字幕| 91精品观看| 国产精品成久久久久| 日本不卡不码高清免费观看| 精品国产美女a久久9999| 日韩中文字幕亚洲一区二区va在线| 精品九九久久| 深夜福利亚洲| 在线综合视频| 亚洲成人一区在线观看| 国产精品xvideos88| 日韩中文字幕1| 亚洲成人va| 精品一区91| 日韩av黄色在线| 亚洲一区二区三区免费在线观看| 在线天堂资源www在线污| 久久精品av麻豆的观看方式| 香蕉视频成人在线观看| 国产成年精品| 国产美女视频一区二区| 亚洲精品动态| 欧美午夜不卡| 日韩精品一区二区三区免费观看| 美女精品一区二区| 91精品啪在线观看国产爱臀| 免费在线观看精品| 亚洲一区久久| 婷婷成人基地| 激情视频一区二区三区| 视频二区不卡| 涩涩av在线| 国产在线看片免费视频在线观看| 麻豆高清免费国产一区| 日韩精品一区二区三区中文字幕| 久久亚洲不卡| 国产视频一区在线观看一区免费| 99精品视频在线| 99精品视频在线观看免费播放| 日韩电影免费网址| 精品高清久久| 成人污污视频| 91综合视频| 神马日本精品| 国产综合色产| 国产一区二区精品| 亚洲综合精品| 中文不卡在线| 日韩精品高清不卡| 蜜桃av一区二区在线观看| 视频一区中文字幕| 少妇精品在线| 国产欧美另类| 久久精品网址| 国产精品精品国产一区二区| 91亚洲国产成人久久精品| 国产日韩电影| 五月天久久777| 中文不卡在线| 欧美一级久久| 精品三级av| av最新在线| 午夜欧美精品| 综合亚洲视频| 日韩1区2区3区| 国产乱码精品一区二区三区亚洲人| 国产精品网站在线看| 精品久久中文| 性欧美xxxx免费岛国不卡电影| 国内精品99| 亚洲免费资源| 久久精品国产亚洲aⅴ| 日韩精品看片| 免费人成网站在线观看欧美高清| 青青草视频一区| 国产91在线精品| 亚洲精品888| 人人精品久久| 国产999精品在线观看| 国产综合色区在线观看| 欧美大黑bbbbbbbbb在线| 亚洲欧美日韩精品一区二区| 日韩精品一区二区三区中文在线 | 999在线观看精品免费不卡网站| 91亚洲成人| 日本综合视频| 亚洲免费播放| 蘑菇福利视频一区播放| 91成人小视频| 国产亚洲电影| 国产日韩欧美一区在线| 国产黄大片在线观看| 亚洲a在线视频| 亚洲精品一二| 成人三级高清视频在线看| 99国产成+人+综合+亚洲欧美| 亚洲97av| 高清一区二区| 久久www成人_看片免费不卡| 国产区精品区| 999久久久91| 97成人在线| 久久精品卡一| 亚洲专区视频| 久久久久久夜| 日韩视频1区| 久久久精品久久久久久96| 日本国产欧美| 色偷偷色偷偷色偷偷在线视频| 人人爽香蕉精品| 久久久男人天堂| 亚洲+小说+欧美+激情+另类| 欧美成人基地| 美日韩一区二区三区| 国产精品美女| a天堂资源在线| 欧美日韩99| 国产亚洲综合精品| 久久丁香四色| 美日韩精品视频| 久久久久久网| 欧美精品观看| 蜜臀久久99精品久久久久久9| 国产精品精品国产一区二区| 五月国产精品| 婷婷国产精品| 国产成人免费av一区二区午夜| 亚洲精品免费观看| 偷拍欧美精品| av免费不卡国产观看| 欧美日韩a区| 亚洲一区有码| 狠狠色综合网| 精品日韩一区| 日本aⅴ精品一区二区三区| 亚洲在线电影| 激情久久久久久久| 国产精品久久久久蜜臀| 国产欧美一区二区色老头| 免费在线观看成人| 在线精品小视频| 91精品亚洲| 亚洲三级欧美| 国产精品久久久久蜜臀| 老牛国内精品亚洲成av人片| 久久狠狠久久| 日韩av中文在线观看| 亚洲精品精选| 在线亚洲国产精品网站| 日韩av一级| 福利一区视频| 精品国产精品国产偷麻豆 | 国产成人精品亚洲线观看| 国产欧美一区二区色老头|