文档章节

feign client的retry及超时设置

go4it
 go4it
发布于 2017/02/06 16:29
字数 559
阅读 1017
收藏 1

##默认值 ###默认maxAttempts值 /Users/xixicat/.m2/repository/io/github/openfeign/feign-core/9.3.1/feign-core-9.3.1-sources.jar!/feign/Retryer.java

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;
    }

###retry逻辑 /Users/xixicat/.m2/repository/io/github/openfeign/feign-core/9.3.1/feign-core-9.3.1-sources.jar!/feign/Retryer.java

public void continueOrPropagate(RetryableException e) {
      if (attempt++ >= maxAttempts) {
        throw e;
      }

      long interval;
      if (e.retryAfter() != null) {
        interval = e.retryAfter().getTime() - currentTimeMillis();
        if (interval > maxPeriod) {
          interval = maxPeriod;
        }
        if (interval < 0) {
          return;
        }
      } else {
        interval = nextMaxInterval();
      }
      try {
        Thread.sleep(interval);
      } catch (InterruptedException ignored) {
        Thread.currentThread().interrupt();
      }
      sleptForMillis += interval;
    }

这里attempt初始值为1,即把第一次的请求也算上去了,先执行attempt >= maxAttempts判断,再执行attempt++。因此maxAttempts设置为2表示重试1次。 /Users/xixicat/.m2/repository/io/github/openfeign/feign-core/9.3.1/feign-core-9.3.1-sources.jar!/feign/SynchronousMethodHandler.java

@Override
  public Object invoke(Object[] argv) throws Throwable {
    RequestTemplate template = buildTemplateFromArgs.create(argv);
    Retryer retryer = this.retryer.clone();
    while (true) {
      try {
        return executeAndDecode(template);
      } catch (RetryableException e) {
        retryer.continueOrPropagate(e);
        if (logLevel != Logger.Level.NONE) {
          logger.logRetry(metadata.configKey(), logLevel);
        }
        continue;
      }
    }
  }

###关于++

    @Test
    public void testPlus(){
        int attempt = 1;
        int maxAttempts = 1;
        try{
            if(attempt++ == maxAttempts){
                throw new RuntimeException("EXCEED");
            }
        }finally {
            System.out.println(attempt);
        }
    }

输出

2

java.lang.RuntimeException: EXCEED

  at XXXTest.testPlus(XXXTest.java:50)

###默认超时时间 /Users/xixicat/.m2/repository/io/github/openfeign/feign-core/9.3.1/feign-core-9.3.1-sources.jar!/feign/Request.java

	public Options(int connectTimeoutMillis, int readTimeoutMillis) {
      this.connectTimeoutMillis = connectTimeoutMillis;
      this.readTimeoutMillis = readTimeoutMillis;
    }

    public Options() {
      this(10 * 1000, 60 * 1000);
    }

##参数设置 ###timeout设置

	@Bean
    Request.Options feignOptions() {
        return new Request.Options(/**connectTimeoutMillis**/1 * 1000, /** readTimeoutMillis **/1 * 1000);
    }

###retry配置

    @Bean
    Retryer feignRetryer() {
        return Retryer.NEVER_RETRY;
    }

##响应时间 ###默认retry响应时间(1s connectTimeout,1s readTimeout)

Percentage of the requests served within a certain time (ms)
  50%   6718
  66%   7020
  75%   7371
  80%   8237
  90%   8404
  95%   8404
  98%   8404
  99%   8404
 100%   8404 (longest request)

###不retry(1s connectTimeout,1s readTimeout)

Percentage of the requests served within a certain time (ms)
  50%   1219
  66%   1230
  75%   1307
  80%   1485
  90%   1674
  95%   1674
  98%   1674
  99%   1674
 100%   1674 (longest request)

###不retry(5s connectTimeout,5s readTimeout)

Percentage of the requests served within a certain time (ms)
  50%   5561
  66%   5592
  75%   5653
  80%   5677
  90%   5778
  95%   5778
  98%   5778
  99%   5778
 100%   5778 (longest request)

##小结 feign client默认的connectTimeout为10s,readTimeout为60.单纯设置timeout,可能没法立马见效,因为默认的retry为5次.因此,如果期望fail fast的话,需要同时自定义timeout以及retry的参数,而且要确保反向代理,比如nginx的proxy_connect_timeout以及proxy_read_timeout要大于feign的配置才能见效,不然对外部用户感知到的还是nginx的504 Gateway Time-out,起不到fallback的效果。

##doc

© 著作权归作者所有

go4it
粉丝 87
博文 1067
码字总数 1012475
作品 0
深圳
私信 提问
Spring Cloud Feign重试机制

Spring Cloud Feign重试机制 Feign组件默认使用Ribbon的重试机制并增加了根据状态码判断重试机制,默认情况下是不启用的。Feign使用的是Spring Retry组件,需要引入依赖才能启用。 1、POM引入...

如梦之猿
06/18
43
0
禁用feign retryer

为什么要禁用retryer?其实主要是为了Debug,禁用feign retryer有两面性,如果接口做好幂等性,retry不影响,但是总有一些意外发生,比如:有一个实例发生了故障而该情况还没有被服务治理机制...

只喝牛奶的杀手
2018/08/12
0
0
生产技巧:Feign如何控制Hystrix的启停、超时、熔断?

原文:http://www.itmuch.com/spring-cloud-sum/feign-hystrix/ ,转载请说明出处。 这也是一篇写于2017-08前后的工作日志,当时由于项目比较多,很多团队对Feign和Hystrix之间的小暧昧搞不清...

周立_ITMuch
2018/12/03
367
0
FeignClient Hystrix 超时测试2

@Configurable public class DisableHystrixConfiguration { /** * 没设置超时 * @return / @Bean @Scope ("prototype") public Feign.Builder feignBuilder() { return Feign.builder(); }......

xiaomin0322
04/09
9
0
springCloud(11):使用Hystrix实现微服务的容错处理-简介与实现

一、问题引入 如果服务提供者响应非常缓慢,那么消费者对提供者的请求就会被强制等待,直到提供者响应或超时。在高负载场景下,如果不作任何处理,此类问题可能会导致服务消费者的资源耗尽甚...

我爱大金子
2017/07/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部