最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決FeignClient重試機(jī)制造成的接口冪等性

 更新時(shí)間:2021年07月05日 10:57:36   作者:doinbb  
這篇文章主要介紹了解決FeignClient重試機(jī)制造成的接口冪等性問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

FeignClient重試機(jī)制造成的接口冪等性

Feign源碼分析,其實(shí)現(xiàn)類在 SynchronousMethodHandler,實(shí)現(xiàn)方法是public Object invoke(Object[] argv) ,它的代碼分析如下:

1.構(gòu)造請求數(shù)據(jù),將對象轉(zhuǎn)換為json:

RequestTemplate template = buildTemplateFromArgs.create(argv);

2.發(fā)送請求進(jìn)行執(zhí)行(執(zhí)行成功會(huì)解碼響應(yīng)數(shù)據(jù)):

executeAndDecode(template, options);

3. 執(zhí)行請求會(huì)有重試機(jī)制:

Retryer retryer = this.retryer.clone();
    while (true) {
      try {
        return executeAndDecode(template, options);
      } catch (RetryableException e) {
        try {
          retryer.continueOrPropagate(e);
        } catch (RetryableException th) {
          Throwable cause = th.getCause();
           // 重試結(jié)束 或則 不允許重試,則通過拋異常的形式終止 
          if (propagationPolicy == UNWRAP && cause != null) {
            throw cause;
          } else {
            throw th;
          }
        }
        if (logLevel != Logger.Level.NONE) {
          logger.logRetry(metadata.configKey(), logLevel);
        }
        continue;
      }
    }

4. Retryer是重試器,其實(shí)現(xiàn)方法有兩種

第一種是系統(tǒng)默認(rèn)實(shí)現(xiàn)方式,第二種是可以自定義重試器,一般少用,通過默認(rèn)實(shí)現(xiàn)重試類Default可以看到其構(gòu)造函數(shù)中的重試次數(shù)為5。

    public Default() {
      this(100, SECONDS.toMillis(1), 5);
      }
 
    public Default(long period, long maxPeriod, int maxAttempts) {
      this.period = period;
      this.maxPeriod = maxPeriod;
      this.maxAttempts = maxAttempts;
      this.attempt = 1;
    }

因此解決Feign調(diào)用的冪等性問題最簡單也就最常用的就是讓Feign不重試。

為FeignClient增加請求重試機(jī)制

spring cloud通過feign client進(jìn)行服務(wù)之間調(diào)用的時(shí)候,默認(rèn)不會(huì)進(jìn)行重試,這樣會(huì)有一個(gè)問題,比如你的服務(wù)在滾動(dòng)升級重啟的時(shí)候,feign的調(diào)用將直接失敗,但其實(shí)我是滾動(dòng)重啟,重啟了一個(gè)服務(wù)實(shí)例,還有另外一個(gè)服務(wù)實(shí)例是可用的,應(yīng)該允許自動(dòng)均衡策略重試請求發(fā)送到另外一個(gè)可用的服務(wù)實(shí)例上去。

要啟用重試機(jī)制,首先必須引入spring-retry依賴:

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

然后通過注冊一個(gè)bean:

  /**
     *
     * 注冊一個(gè)重試Bean
     * 默認(rèn)FeignClient不會(huì)進(jìn)行重試,使用的是{@link feign.Retryer#NEVER_RETRY}
     *
     * @see FeignClientsConfiguration#feignRetryer()
     */
    @Bean
    public Retryer feignRetryer() {
        return new Retryer.Default();
    }

大功告成。

不過還有個(gè)前提就是,你的遠(yuǎn)程調(diào)用接口方法的必須是冪等的(比如GET方法認(rèn)為是冪等的,調(diào)用多少次結(jié)果都一樣,而POST方法有可能有重復(fù)提交問題),不然還是不會(huì)重試的,因?yàn)槠渌鸋ttpMethod被認(rèn)為是非冪等的,不能重復(fù)執(zhí)行,因此不能被重試

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mybatis中關(guān)于type-aliases-package的使用

    mybatis中關(guān)于type-aliases-package的使用

    這篇文章主要介紹了mybatis中關(guān)于type-aliases-package的使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • java小程序火鍋店點(diǎn)餐系統(tǒng)

    java小程序火鍋店點(diǎn)餐系統(tǒng)

    這篇文章主要介紹了java小程序火鍋店點(diǎn)餐系統(tǒng),采用Java語言和Vue技術(shù),以小程序模式實(shí)現(xiàn)的火鍋點(diǎn)菜系統(tǒng),文中提供了解決思路和部分實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2023-03-03
  • MyBatis使用級聯(lián)操作解決lombok構(gòu)造方法識別失敗問題

    MyBatis使用級聯(lián)操作解決lombok構(gòu)造方法識別失敗問題

    這篇文章主要介紹了MyBatis使用級聯(lián)操作解決lombok構(gòu)造方法識別失敗問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Ubuntu16.04 64位下JDK1.7的安裝教程

    Ubuntu16.04 64位下JDK1.7的安裝教程

    這篇文章主要為大家詳細(xì)介紹了Ubuntu16.04 64位下JDK1.7的安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • Java?OpenCV圖像處理之自定義圖像濾波算子

    Java?OpenCV圖像處理之自定義圖像濾波算子

    這篇文章主要為大家介紹了如何利用Java?OpenCV實(shí)現(xiàn)自定義圖像濾波(降噪)?算子,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編學(xué)習(xí)一下
    2022-02-02
  • mybatis中返回主鍵一直為1的問題

    mybatis中返回主鍵一直為1的問題

    這篇文章主要介紹了mybatis中返回主鍵一直為1的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • java生成驗(yàn)證碼圖片的方法

    java生成驗(yàn)證碼圖片的方法

    這篇文章主要為大家詳細(xì)介紹了java生成驗(yàn)證碼圖片的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • java實(shí)現(xiàn)清理DNS Cache的方法

    java實(shí)現(xiàn)清理DNS Cache的方法

    這篇文章主要介紹了java實(shí)現(xiàn)清理DNS Cache的方法,分析了幾種常用的清理方法,并給出了反射清理的完整實(shí)例,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • Java實(shí)現(xiàn)多級表頭和復(fù)雜表頭的導(dǎo)出功能

    Java實(shí)現(xiàn)多級表頭和復(fù)雜表頭的導(dǎo)出功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)多級表頭和復(fù)雜表頭的導(dǎo)出功能的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Mybatis-plus操作json字段實(shí)戰(zhàn)教程

    Mybatis-plus操作json字段實(shí)戰(zhàn)教程

    這篇文章主要介紹了Mybatis-plus操作json字段實(shí)戰(zhàn)教程,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02

最新評論

垣曲县| 阜阳市| 达尔| 冀州市| 扎赉特旗| 洞口县| 工布江达县| 西华县| 福建省| 景德镇市| 兴和县| 汉中市| 岳池县| 缙云县| 珲春市| 谷城县| 山阴县| 通海县| 武陟县| 永靖县| 从化市| 台南县| 西林县| 廊坊市| 马山县| 苏尼特右旗| 武城县| 达孜县| 洪泽县| 静宁县| 新沂市| 怀柔区| 新宁县| 邻水| 二手房| 武冈市| 马龙县| 张家界市| 馆陶县| 泰顺县| 周口市|