欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

解決FeignClient重試機制造成的接口冪等性

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

FeignClient重試機制造成的接口冪等性

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

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

RequestTemplate template = buildTemplateFromArgs.create(argv);

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

executeAndDecode(template, options);

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

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是重試器,其實現(xiàn)方法有兩種

第一種是系統(tǒng)默認實現(xiàn)方式,第二種是可以自定義重試器,一般少用,通過默認實現(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增加請求重試機制

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

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

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

然后通過注冊一個bean:

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

大功告成。

不過還有個前提就是,你的遠程調(diào)用接口方法的必須是冪等的(比如GET方法認為是冪等的,調(diào)用多少次結(jié)果都一樣,而POST方法有可能有重復(fù)提交問題),不然還是不會重試的,因為其他HttpMethod被認為是非冪等的,不能重復(fù)執(zhí)行,因此不能被重試

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

相關(guān)文章

  • java實現(xiàn)圖片轉(zhuǎn)base64字符串 java實現(xiàn)base64字符串轉(zhuǎn)圖片

    java實現(xiàn)圖片轉(zhuǎn)base64字符串 java實現(xiàn)base64字符串轉(zhuǎn)圖片

    這篇文章主要為大家詳細介紹了java實現(xiàn)圖片轉(zhuǎn)base64字符串,java實現(xiàn)base64字符串轉(zhuǎn)圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • SpringCloud客戶端報錯:- was unable to send heartbeat!的解決

    SpringCloud客戶端報錯:- was unable to send&nb

    這篇文章主要介紹了SpringCloud客戶端報錯:- was unable to send heartbeat!的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • SpringBoot Service和Dao的編寫詳解

    SpringBoot Service和Dao的編寫詳解

    這篇文章主要介紹了SpringBoot Service和Dao的編寫詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • lombok中@Data使用常見的小坑及解決

    lombok中@Data使用常見的小坑及解決

    在Java中使用Lombok庫的@Data注解時,布爾類型屬性可能導(dǎo)致生成的get方法不符合預(yù)期,對于非is開頭的布爾屬性,Lombok生成的方法會添加is前綴,導(dǎo)致原本期待的get方法不存在,例如,對于屬性private boolean active,Lombok會生成方法名為isActive而不是getActive
    2024-10-10
  • 透過Spring源碼查看Bean的命名轉(zhuǎn)換規(guī)則圖文詳解

    透過Spring源碼查看Bean的命名轉(zhuǎn)換規(guī)則圖文詳解

    Java Bean是一種 Java 編程語言編寫的可重用軟件組件,包括符合一定規(guī)范的Java 類、屬性和方法,用于描述和處理應(yīng)用程序中的數(shù)據(jù)對象,下面這篇文章主要給大家介紹了關(guān)于透過Spring源碼查看Bean的命名轉(zhuǎn)換規(guī)則的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • IDEA中的maven沒有dependencies解決方案

    IDEA中的maven沒有dependencies解決方案

    這篇文章主要介紹了IDEA中的maven沒有dependencies解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Java虛擬機裝載和初始化一個class類代碼解析

    Java虛擬機裝載和初始化一個class類代碼解析

    這篇文章的主要內(nèi)容是Java虛擬機裝載和初始化一個class類的代碼解析,包括介紹了裝載和初始化的時機與方式,需要的朋友可以參考下。
    2017-09-09
  • SpringBoot項目實戰(zhàn)之加載和讀取資源文件

    SpringBoot項目實戰(zhàn)之加載和讀取資源文件

    在項目的開發(fā)中,我們知道的是SpringBoot框架大大減少了我們的配置文件,但是還是留下了一個application.properties文件讓我們可以進行一些配置,下面這篇文章主要給大家介紹了關(guān)于SpringBoot項目實戰(zhàn)之加載和讀取資源文件的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • Spring Boot集成MinIO對象存儲服務(wù)器操作步驟

    Spring Boot集成MinIO對象存儲服務(wù)器操作步驟

    通過Spring Boot集成MinIO,你可以在應(yīng)用中方便地進行文件的存儲和管理,本文給大家分享Spring Boot集成MinIO對象存儲服務(wù)器詳細操作步驟,感興趣的朋友一起看看吧
    2024-01-01
  • java編程實現(xiàn)優(yōu)先隊列的二叉堆代碼分享

    java編程實現(xiàn)優(yōu)先隊列的二叉堆代碼分享

    這篇文章主要介紹了java編程實現(xiàn)優(yōu)先隊列的二叉堆代碼分享,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11

最新評論