转-原文:https://xli1224.github.io/2017/09/22/configure-feign/

在分析 Feign 源码的时候,我们看到 Feign 构建代理对象是分了几层的,一层是选择 Builder,Feign.Builder 或者是它的子类 HystrixFeign.Builder;接下来两个 Builder 会选择不同的动态代理类创建逻辑,一个是 ReflectiveFeign.FeignInvocationHandler 或者是 HystrixInvocationHandler。两者的区别主要是直接用 SynchronousMethodHandler 的 invoke 方法,或者是将 invoke 混合起来做成 HystrixMethod。如果排除掉 fallback 的情况,两者应该是一致的,即 SynchronousMethodHandler 的 invoke。其中 Retry 逻辑是包含在 SynchronousMethodHandler 里面。所以使用了 Feign + Hystrix +Retry 后,整体 client 的包含逻辑是如下图的。

以设计意图来说,Feign Client 的配置关注在每次 Http Request 上,Retry 关注的是 Feign Client 出问题以后的 Retry 逻辑,而 Hystrix 关心的是整个调用何时能成功,出错了如何 fallback,所有调用的并发控制,是否要熔断终止调用等问题。

所以在配置 Feign Client 的超时时,会发现一些配置情景可能跟直觉不同。假设当前有一个 User Service,它有两个实例,一个实例在4s 后返回 User 列表,另一个实例在8s 后返回 User 实例。我们希望能够在访问一个实例超时后自动 Retry 另一个,而且当两个都超时后 fallback。

我们先配置一下 Feign Client 的超时配置。关于 Feign Client 的配置还有个比较有趣的现象,尽管对于全局的 Feign Client 已经能够通过配置文件来进行默认属性的配置,但是这个 pull 并没有进入最新 GA 的 Dalston SR3版本。该 pull 在这里 `FeignClient Configuration Properties by khannedy · Pull Request #1942 · spring-cloud/spring-cloud-netflix · GitHub ,可以看到该 pull 被安排进了 Edgware 版本。当前项目使用还是用的 Dalston,所以只能用 configuraiotn 的形式来为每个 FeignClient 单独配置。

@Configuration
public class FeignClientConfiguration {
@Bean
public Request.Options options() {
return new Request.Options(
6000,
6000
);
}
}

如此配置以后会发现,大概1s 时间就直接进入 fallback 了。因为这时候开启了 hystrix,而 hystrix 的默认 timeout 是1s。我们先把 hystrix 的 timeout 关闭。hystrix.command.default.execution.timeout.enabled=false,再测试。现在就可以了,客户端会去访问 User Service,并且在访问到8s 的那个实例时如期超时,并且 Retry 会将它转向下一个实例,等待4s 后返回结果。

现在我们把 hystrix 的 timeout 再次开启,将其也设置为6s,会发生什么?

hystrix.command.default.execution.timeout.enabled=true
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 6000

结果就是当前如果轮询到了8s 的实例,则进入 fallback,而轮询到了4s 的实例就能正常返回结果。看起来似乎 Retry 没有生效。实际上根据我们上面的分析,并不是这样的,而是因为 Hystrix 控制的是整个执行的耗时,它不在乎你是否要 Retry,或者 Retry 几次,总要有个人看着你的完整请求耗时时间。所以如果我们把 Hystrix 的超时时间,调整为 Feign Client 的两倍,即12s。这样能保证 Feign Client 起码能做完两次请求。在我们的情况中,第一次请求会在6s 中的时候由 Feign Client 主动终止,而第二次请求会在4s 后返回,总体10s,并不会触发 Hystrix 的 timeout,所以能够正常工作。结果也是如此。

FeignClientConfiguration 代码设置或者 ribbon 超时间
ribbon:
ReadTimeout: 10000
ConnectTimeout: 10000
 

Feign超时设置的更多相关文章

  1. Feign 超时设置

    问题描述 微服务之间使用 Feign 调用,偶发超时问题,配置如下: feign: client: config: default: connectTimeout: 10000 readTimeout ...

  2. 定时任务与feign超时的纠葛,该咋优化?

    1 背景 业务定时器应用半夜经常会触发熔断异常的告警邮件 根据邮件提示的类找到归纳以下表格 编号 报错方法 接口所属应用 所属定时任务类 A VipTradeReportFeignService#ge ...

  3. Hystrix配置实战及feign超时配置失效

    一.feign超时配置失效 最近项目上遇见feign超时配置总是失效.导致feign调用超过2s之后就会超时,会进行自动重试,重复调用两次服务,并且还是指定接口.这就更加奇怪.最后通过观察以及源码调试 ...

  4. delphi tidhttp 超时设置无效的解决方法

    现在delphi都发布到xe8了,tidhttp还有缺陷,那就是超时设置在没有网络或者连不上服务器的时候是无效的,不管你设置为多少都要10-20秒.connectTimeout和readTimeout ...

  5. Linux串口中的超时设置

    在Linux下使用串口通信时,默认的阻塞模式是不实用的.而采用select或epoll机制的非阻塞模式,写代码有比较麻烦.幸好Linux的串口自己就带有超时机制. Linux下使用termios.h中 ...

  6. org.apache.http.client.HttpClient; HttpClient 4.3超时设置

    可用的code import org.apache.commons.lang.StringUtils;import org.apache.http.HttpEntity;import org.apac ...

  7. HttpClient 3.X 4.3 4.x超时设置

    HttpClient 4.3.HttpClient这货和Lucene一样,每个版本的API都变化很大,这有点让人头疼.就好比创建一个HttpClient对象吧,每一个版本的都不一样, 3.X是这样的 ...

  8. Apache性能优化、超时设置,linux 重启apache

    在httpd.conf中去掉Include conf/extra/httpd-default.conf前的#以使httpd-default.php生效.其中调节以下参数Timeout 15 (连接超时 ...

  9. libcurl多线程超时设置不安全(转)

    from http://www.cnblogs.com/kex1n/p/4135263.html (1), 超时(timeout) libcurl 是 一个很不错的库,支持http,ftp等很多的协议 ...

随机推荐

  1. NOIP模拟 6

    考试时看了看T1,觉得是结论题,推了推没有成果,跑去看第二题, 题意很明确,求过定点的最小环,还没思考解题策略,然后觉得是水题 打了个tarjan找边双(据说会炸但是平均表现良好),在边双里暴力拆边找 ...

  2. Java多线程中join、yield、sleep方法详解

    在Java多线程编程中,Thread类是其中一个核心和关键的角色.因此,对该类中一些基础常用方法的理解和熟练使用是开发多线程代码的基础.本篇主要总结一下Thread中常用的一些静态方法的含义及代码中的 ...

  3. python基础-函数作用域

    函数 函数对象 函数是第一类对象 函数名可以被引用 函数名可以当作参数使用 函数名可以当作返回值使用 函数名可以当作容器类型的元素 函数嵌套 嵌套调用:在函数内部中调用函数 嵌套定义:在函数内部中定义 ...

  4. 如何在Vue-cli项目中使用JTopo

    1.前言 jTopo(Javascript Topology library)是一款完全基于HTML5 Canvas的关系.拓扑图形化界面开发工具包.其体积小,性能优异,由一群开发爱好者来维护.唯一感 ...

  5. 路径操作OS模块和Path类(全)一篇够用!

    路径操作 路径操作模块 os模块 os属性 os.name # windows是nt, linux是posix os.uname() # *nix支持 sys.platform #sys模块的属性, ...

  6. 201871010114-李岩松《面向对象程序设计(java)》第十一周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  7. Groovy单元测试框架spock基础功能Demo

    spock是一款全能型的单元测试框架. 最近在做单元测试框架的调研和尝试,目前确定的方案框架包括是:spock,Junit,Mockito以及powermock.由于本身使用Groovy的原因,比较钟 ...

  8. Verilog模块概念和实例化#转载自Jason from Lofter

    Verilog模块概念和实例化 模块的概念 模块(module)是verilog最基本的概念,是v设计中的基本单元,每个v设计的系统中都由若干module组成. 1.模块在语言形式上是以关键词modu ...

  9. nyoj 108-士兵杀敌(一)(数学)

    108-士兵杀敌(一) 内存限制:64MB 时间限制:1000ms 特判: No 通过数:60 提交数:221 难度:3 题目描述: 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. ...

  10. 《JAVA 程序员面试宝典(第四版)》之循环、条件、概率

        分享内容:关于集合的使用   书页号码:77页 题目:一个字符串中包含a~z中的多个字符,如有重复,如String data = "aavzcadfdsfsdhshgwasdfasd ...