国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 開發 > Java > 正文

Spring Cloud Gateway重試機制的實現

2024-07-14 08:43:47
字體:
來源:轉載
供稿:網友

前言

重試,我相信大家并不陌生。在我們調用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小區");}

更多Spring Cloud代碼盡在:https://github.com/yinjihuan/spring-cloud

源碼欣賞

  @Override  public 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 series          retryableStatusCode = 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);    };  }

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


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产精品偷乱一区二区三区| 中文字幕不卡| 国产香蕉免费精品视频| 国产免费福利网站| 国产乱xxⅹxx国语对白| 国产精品久久久久一区二区国产| 国产一区二区三区不卡免费观看| 久久久久久五月天久久久久久久久| 亚洲人在线播放| 99热在线观看免费| 99热国产在线| 最好看更新中文字幕| 精品极品三级久久久久| 精品国产美女福利到在线不卡| 亚洲视频日韩| 自拍亚洲国产| 欧美日韩久久中文字幕| 国产精品合集一区二区| www.蜜桃av| 91中文在线| 国产理论在线观看| 91黄色在线| 成人精品福利| 在线观看午夜av| 中文字幕在线影视资源| 亚洲欧美一区二区三区在线播放| 好男人免费精品视频| 7777在线| 国产网红在线观看| 久久99亚洲网美利坚合众国 | 香蕉视频网站在线观看| 国产乱妇乱子在线播视频播放网站| 国产精品186在线观看在线播放| 四虎影视成人永久免费观看视频| 国产黄视频在线观看| 国产理论在线观看| 日本不卡影院| 午夜在线视频| av丝袜在线| 精品国内自产拍在线视频| 国产一二三视频| 国内a∨免费播放| 久久国产综合视频| 成人av小说网| 国产精品自产拍在线网站| 欧美精品se| 爱福利在线视频| 在线一区观看| h网址在线观看| 欧美日韩亚洲第一页| 奇米影视狠狠狠| 欧美性猛交p30| 久久精品免视着国产成人| 四虎成人精品在永久免费| 亚洲欧美日韩综合精品网| www.综合网.com| 国产综合视频一区二区三区免费| 免费观看一二区视频网站| 久久91精品视频| 国产视频二区在线观看| 精品入口麻豆传煤| 免费av不卡在线观看| 国产一级黄色片免费| 精品av中文字幕在线毛片| 亚洲久草视频| 国产免费视频| 国产白浆在线| 免费a级人成a大片在线观看| 国产香蕉在线| 性色视频在线| 国产香蕉免费精品视频| japanese色国产在线看视频| 黄色片大全在线观看| 国产羞羞视频在线观看| 四虎网站在线观看| 国产精品理人伦一区二区三区| 一个人看的www免费观看视频| 欧美a免费在线| 91社区在线观看| 午夜在线小视频| 日本久久国产| 国产wwww| 国产精品第八页| 天天操天天曰| 久久久久久久久久久久网站| 国产福利微拍精品一区二区| 国产在线看片| 欧美日韩在线视频免费观看| 91免费日韩| 国产精品久久精品牛牛影视| 国产在线观看色| 久草在线资源福利| 日韩黄色成人| 亚洲欧美中文字幕在线观看| 国产精品免费91| 国产精品一卡二卡三卡| 亚洲人在线播放| 制服丝袜中文字幕在线观看| 国产精品合集一区二区| 国产精选在线观看| 久草网在线视频| 免费a级毛片在线播放| 青青草原国产在线| 亚洲夜夜综合| 色欧美在线观看| 天天干天天操天天爽| 亚洲wwwwww| 日本不卡视频一区二区| www.夜夜操| 超碰国产在线| 天堂资源在线中文| 国产美女性感在线观看懂色av| 秋霞av在线| 好男人社区在线视频| 丁香花在线电影| 中文字幕第一页在线| 国产日产精品久久久久久婷婷| 国产福利免费观看| 亚洲综合天堂网| eeuss影院网站免费观看| xxx国产精品| 91超碰国产在线| 99爱视频在线观看| 久久一本精品| 国产黄大片在线观看画质优化| 国产成人综合亚洲欧美在| 国产第一页在线| www.xxx黄| 国产精品视频一区二区三区麻豆 | 狠狠干天天干| 国产三级视频在线播放线观看| 91在线看片| 丁香婷婷激情| 亚洲欧美中文字幕在线观看 | 国产人成在线视频| 中文视频在线| 国产麻豆精品入口在线观看| 97人人在线| 中文字幕在线免费观看| 亚洲精品一区中文字幕电影| 丁香在线视频| 日本一本久久| 国产精品xxx电影| 交视频在线观看国产| 精品推荐蜜桃传媒| 午夜伦全在线观看| 久草国产视频| 青青久草在线| 亚洲欧美日韩成人网| 国产激情在线视频| 大香伊人中文字幕精品| xxx国产精品| 亚洲国产精品区| 国产www.大片在线| 国产一卡2卡3卡4卡网站免费| 日本在线天堂| 亚洲欧美中文字幕在线观看| 2020国产在线视频| 国产偷激情在线| 中中文字幕av在线| 天天操人人干| 中文字幕在线观看日本| 天天操天天射天天色| 88av在线| 国产精品久久麻豆| 国产一级免费| 国产日韩网站| 国产超碰97| 在线天堂视频| 日本aⅴ写真网站免费| 俺来俺也去www色在线观看| 亚洲国产成人综合| 亚洲欧洲成人| www狠狠操| 成年网在线观看免费观看网址| 国内自拍视频在线观看| 午夜国产在线| 69久久久久| аⅴ成人天堂中文在线| 黄色一级视频网站| 天堂中文字幕在线| 国产黄色网页| 四虎成人精品在永久免费| 国产在线视频精品视频免费看| 国产主播福利在线| 91麻豆精品国产91久久| 日本调教视频在线观看| 国产免费视频| 在线观看中文| 国产午夜精品一区理论片| 精品黄色免费中文电影在线播放| а√资源新版在线天堂| 国产九九九九| 亚洲男人网站| 国产私拍精品| www.av在线视频| 国产精品免费视频一区一| 日韩亚洲一区中文字幕| 国产视频三区| 国产精品自产拍在线观看2019|