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

Feign自定義重試策略及超時時間詳解

 更新時間:2023年07月28日 11:57:18   作者:羅_宇  
這篇文章主要為大家介紹了Feign自定義重試策略及超時時間詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

背景

feign可以配置重試策略及超時時間,但是無法根據(jù)業(yè)務(wù)場景動態(tài)的設(shè)置??赡軙鸾涌趦绲龋瑹o效重試資源耗費,大數(shù)據(jù)量耗時操作報超時異常等問題。所以需要更細(xì)粒度的重試策略及超時時間配置。

自定義重試策略

框架會使用容器中RetryerRequest.Options 類型的配置Bean構(gòu)造對應(yīng)的feignClient Bean, 后續(xù)使用的時候可以直接通過@Autowired 注入即可發(fā)起調(diào)用;

若要進(jìn)行更加靈活的控制feign,也可以手動構(gòu)造FeignClient,通過構(gòu)造時設(shè)置RetryerRequest.Options 可以達(dá)到 feign class 級別控制粒度;

引入全局配置Bean

由于構(gòu)造FeignClient需要依賴一些Bean,所以先構(gòu)造全局配置Bean;

@Slf4j
@Configuration
public class FeignAutoConfiguration {
    public static final int CONNECT_TIME_OUT_MILLIS = 5000;
    public static final int READ_TIME_OUT_MILLIS = 12000;


    @Autowired(required = false)
    private List<AnnotatedParameterProcessor> parameterProcessors = new ArrayList<>();

    @Bean
    public Encoder encoder(ObjectFactory<HttpMessageConverters> messageConverters) {
        Encoder encoder = new SpringEncoder(messageConverters);
        return encoder;
    }

    @Bean
    public Decoder decoder(ObjectFactory<HttpMessageConverters> messageConverters) {
        Decoder decoder = new SpringDecoder(messageConverters);
        return decoder;
    }

    @Bean
    public Contract feignContract(@Qualifier("mvcConversionService") ConversionService feignConversionService) {
        return new SpringMvcContract(this.parameterProcessors, feignConversionService);
    }

    //全局超時配置
    @Bean
    public Request.Options options() {
        return new Request.Options(CONNECT_TIME_OUT_MILLIS, READ_TIME_OUT_MILLIS);
    }

    //全局重試策略
    @Bean
    public Retryer feignRetryer() {
        return Retryer.NEVER_RETRY;
    }

}

手動構(gòu)造FeignClient

根據(jù)上述的配置類,構(gòu)造自定義FeignClient;

此配置需要在調(diào)用方服務(wù)中定義,直接復(fù)制該配置類,根據(jù)需要模仿customRoleClient()方法實現(xiàn)

// 引入全局配置
@Import(value = {FeignAutoConfiguration.class})
@Configuration
public class CustomFeignClientConfiguration {
    @Qualifier("feignClient")
    @Autowired
    private Client client;
    @Autowired
    private Encoder encoder;
    @Autowired
    private Decoder decoder;
    @Autowired
    private Contract contract;
    @Autowired
    private Request.Options options;
    @Autowired
    private Retryer retryer;
    /**
     * 自定義RoleClient; 【后續(xù)擴(kuò)展自定義Feign的模仿本方法配置即可】
     *
     * @return
     */
    @Bean
    public RoleClient customRoleClient() {
        //自定義超時時間,connectTimeout 5s  ; readTimeout  10s;
        Request.Options options = new Request.Options(5, TimeUnit.SECONDS, 10, TimeUnit.SECONDS, true);
        //重試2次
        Retryer.Default retryer = new Retryer.Default(100, SECONDS.toMillis(1), 2);
        return getCustomFeignClient(RoleClient.class, options, retryer);
    }
    /**
     * 手動構(gòu)建feignClient工具方法
     *
     * @param clazz
     * @param options
     * @param retryer
     * @param <T>
     * @return
     */
    private <T> T getCustomFeignClient(Class<T> clazz, Request.Options options, Retryer retryer) {
        //只需要對其中的超時和重試配置自定義,其他的還需要使用全局配置
        //通過反射獲取@FeignClient注解
        FeignClient annotation = clazz.getAnnotation(FeignClient.class);
        return Feign.builder()
                .client(client)
                .options(options == null ? this.options : options)
                .retryer(retryer == null ? this.retryer : retryer)
                .contract(contract)
                .encoder(encoder)
                .decoder(decoder)
                .target(clazz, "http://" + annotation.value());
    }
}

使用自定義FeignClient

由于框架會根據(jù)全局配置構(gòu)造一個FeignClientBean, 上述步驟又手動構(gòu)造了一個Bean,容器中存在兩個相同類型RoleClient的Bean。

使用@Autowired注入需要添加@Qualifier("customRoleClient")標(biāo)識唯一Bean 。

可以使用@Resource 注解,優(yōu)先根據(jù)beanName注入。

// 注入
@Resource
private RoleClient roleClient;
@Resource
private RoleClient customRoleClient;
public void checkRoleDataAuth(String roleId){
    // 使用時直接替換feignClient即可
    //    ResultBody resultBody = roleClient.checkRoleDataAuth(roleId);
    ResultBody resultBody = customRoleClient.checkRoleDataAuth(roleId);
    if (!resultBody.isSuccess()){
        throw new BaseException(resultBody.getCode(),resultBody.getMessage());
    }
}

自定義超時時間

在處理大數(shù)據(jù)量、大文件以、統(tǒng)計等耗時任務(wù)時需要自定義超時時間,防止出現(xiàn)feign調(diào)用超時異常。

feignClient粒度的自定義超時

根據(jù)上文的描述,可以自定義FeignClientBean,從而將超時時間控制在client Bean粒度。

方法粒度的自定義超時

feign方法調(diào)用邏輯

feign.SynchronousMethodHandler#invoke 方法源碼

//feign方法調(diào)用實現(xiàn)
@Override
public Object invoke(Object[] argv) throws Throwable {
  RequestTemplate template = buildTemplateFromArgs.create(argv);
  //獲取當(dāng)前方法的Request.Options超時配置
  Options options = findOptions(argv);
  Retryer retryer = this.retryer.clone();
  while (true) {
    try {
      //方法調(diào)用
      return executeAndDecode(template, options);
    } catch (RetryableException e) {
      //重試
      try {
        retryer.continueOrPropagate(e);
      } catch (RetryableException th) {
        Throwable cause = th.getCause();
        if (propagationPolicy == UNWRAP && cause != null) {
          throw cause;
        } else {
          throw th;
        }
      }
      if (logLevel != Logger.Level.NONE) {
        logger.logRetry(metadata.configKey(), logLevel);
      }
      continue;
    }
  }
}
//從feignClient方法參數(shù)列表中找到Request.Options實例對象
  Options findOptions(Object[] argv) {
    // 如果方法沒有參數(shù),使用client配置
    if (argv == null || argv.length == 0) {
      return this.options;
    }
    //查找并使用參數(shù)列表的Request.Options,若不存在則使用client配置
    return Stream.of(argv)
        .filter(Options.class::isInstance)
        .map(Options.class::cast)
        .findFirst()
        .orElse(this.options);
  }

方法定義

基于以上的代碼分析,可以在feign方法簽名中參數(shù)列表增加一個Request.Options 參數(shù),在調(diào)用的時候動態(tài)構(gòu)建Request.Options對象傳入;

@FeignClient(value = UserConstants.SERVER_NAME)
public interface RoleClient {
    @GetMapping(value = "/openfeign/role/checkRoleDataAuth")
    ResultBody checkRoleDataAuth(@RequestParam("roleId") String roleId, Request.Options options);
}

方法調(diào)用

//自定義超時時間,connectTimeout 5s  ; readTimeout  60s;
Request.Options options = new Request.Options(5, TimeUnit.SECONDS, 60, TimeUnit.SECONDS, true);
ResultBody resultBody = roleClient.checkRoleDataAuth(roleId, options);
//傳入null,使用client中的超時配置
ResultBody resultBody = roleClient.checkRoleDataAuth(roleId, null);

以上就是Feign自定義重試策略及超時時間詳解的詳細(xì)內(nèi)容,更多關(guān)于Feign自定義重試策略超時的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MybatisPlus 主鍵策略的幾種實現(xiàn)方法

    MybatisPlus 主鍵策略的幾種實現(xiàn)方法

    MybatisPlus-Plus支持多種主鍵生成策略,可以通過@TableId注解的type屬性配置,主要策略包括AUTO、INPUT、ASSING_ID、ASSING_UUID和NONE,每種策略適用于不同的場景,下面就來介紹一下
    2024-10-10
  • springboot項目中利用騰訊云上傳存儲文件

    springboot項目中利用騰訊云上傳存儲文件

    本文主要介紹了springboot項目中利用騰訊云上傳存儲文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • springBoot中的CORS跨域注解@CrossOrigin詳解

    springBoot中的CORS跨域注解@CrossOrigin詳解

    這篇文章主要介紹了springBoot中的CORS跨域注解@CrossOrigin詳解,通常,服務(wù)于?JS?的主機(jī)(例如?example.com)與服務(wù)于數(shù)據(jù)的主機(jī)(例如?api.example.com)是不同的,在這種情況下,CORS?可以實現(xiàn)跨域通信,需要的朋友可以參考下
    2023-12-12
  • MybatisPlus之likeRight的用法

    MybatisPlus之likeRight的用法

    這篇文章主要介紹了MybatisPlus之likeRight的用法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Linux環(huán)境下Java項目基礎(chǔ)環(huán)境搭建過程

    Linux環(huán)境下Java項目基礎(chǔ)環(huán)境搭建過程

    文章主要講述了在Linux系統(tǒng)下安裝和配置JDK、Tomcat、MySQL的過程,包括使用tar、rpm、yum命令進(jìn)行軟件安裝,修改環(huán)境變量,啟動服務(wù),配置防火墻,以及初始化MySQL數(shù)據(jù)庫等步驟
    2026-04-04
  • Java FileWriter輸出換行操作

    Java FileWriter輸出換行操作

    這篇文章主要介紹了Java FileWriter輸出換行操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • IDEA JetBrains Mono字體介紹和安裝教程(詳解)

    IDEA JetBrains Mono字體介紹和安裝教程(詳解)

    這篇文章主要介紹了IDEA JetBrains Mono字體介紹和安裝教程,本給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-03-03
  • Java基礎(chǔ)知識之CharArrayWriter流的使用

    Java基礎(chǔ)知識之CharArrayWriter流的使用

    這篇文章主要介紹了Java基礎(chǔ)知識之CharArrayWriter流的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java?中的整型數(shù)據(jù)類型((byte,?short,?int,?long?)的取值范圍及使用不同的整型的場景分析

    Java?中的整型數(shù)據(jù)類型((byte,?short,?int,?long?)的取值范圍及使用不同的整型的場景

    Java中的整型數(shù)據(jù)類型包括byte、short、int和long,每種類型都有不同的內(nèi)存占用和取值范圍,選擇合適的整型類型取決于具體需求,如內(nèi)存敏感場景、性能考量和避免整數(shù)溢出,示例代碼展示了如何聲明和初始化不同整型變量,并打印它們的最大值,感興趣的朋友一起看看吧
    2025-03-03
  • 使用Spring MVC實現(xiàn)雙向數(shù)據(jù)綁定

    使用Spring MVC實現(xiàn)雙向數(shù)據(jù)綁定

    Spring MVC是一個廣泛用于構(gòu)建Java Web應(yīng)用程序的框架,它提供了眾多功能,包括雙向數(shù)據(jù)綁定,在這篇文章中,我們將向Java新手介紹如何使用Spring MVC實現(xiàn)雙向數(shù)據(jù)綁定,以及為什么這個特性如此重要,需要的朋友可以參考下
    2024-01-01

最新評論

呼和浩特市| 当阳市| 和硕县| 浮山县| 高青县| 台安县| 太湖县| 南木林县| 太湖县| 增城市| 黔江区| 多伦县| 崇礼县| 都昌县| 湖州市| 新安县| 曲阜市| 舞阳县| 锡林浩特市| 吉林市| 崇阳县| 辽阳市| 诏安县| 新沂市| 紫阳县| 铁岭市| 龙泉市| 金山区| 湘乡市| 汕尾市| 梁平县| 栖霞市| 岳西县| 新乐市| 普洱| 出国| 昂仁县| 西贡区| 天柱县| 武宣县| 方山县|