转-原文: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. 【51nod 1251】 Fox序列的数量(以及带限制插板法讲解)

    为什么网上没有篇详细的题解[雾 可能各位聚聚觉得这道题太简单了吧 /kk 题意 首先题目是求满足条件的序列个数,条件为:出现次数最多的数仅有一个 分析 感谢 刚睡醒的 JZ姐姐在咱写题解忽然陷入自闭的 ...

  2. Kong06-Kong 的集群怎么用

    Kong 集群允许您通过添加更多的机器来处理更多的传入请求来横向扩展系统.它们将共享相同的配置,因为它们指向相同的数据库.指向相同数据存储的 Kong 节点将属于相同的 Kong 集群. 您需要在Ko ...

  3. Lab_1:练习3——分析bootloader进入保护模式的过程

    文章链接:https://www.cnblogs.com/cyx-b/p/11809742.html 作者:chuyaoxin 一.实验内容 BIOS将通过读取硬盘主引导扇区到内存,并转跳到对应内存中 ...

  4. 敏捷宣言(Agile Manifesto)和敏捷开发十二原则

    敏捷宣言 The Agile Manifesto Individuals and interactions over Process and tools 个体与交互 重于 过程和工具 Working ...

  5. SP5150 JMFILTER - Junk-Mail Filte(并查集)

    直秒并查集.这题的难点就在于怎么删点.如果要删的是叶节点,那还好,直接刨掉即可 如果是中间节点甚至是根节点,那就不好办了..... solution: 对于独立一个点,我可以用邻接表模拟,然后用并查集 ...

  6. IntelliJ IDEA自动部署项目至远程服务器与传统部署项目至远程服务器的区别

    每次开发Java项目时,对于所有Java开发人员来说,最枯燥的不是修改代码,而是实时将自己的代码上传至远程服务器,进行测试或者部署,本人最初开发也是这样,通过使用Xshell 5,WinSCP等工具对 ...

  7. javascript中判断数据类型

    编写javascript代码的时候常常要判断变量,字面量的类型,可以用typeof,instanceof,Array.isArray(),等方法,究竟哪一种最方便,最实用,最省心呢?本问探讨这个问题. ...

  8. C# 获取系统当前登录用户(管理员身份运行同样有效)

    今天学习下怎么用.Net获取系统当前登陆用户名,因为目前网上基本只有最简单的方式,但以管理员身份运行的话就会获取不到,所以特整理一下作为分享,最后附带参考文档,方便深究的童鞋继续学习. ======= ...

  9. 网站搭建-2-本地网站搭建-安装Linux虚拟机/ 安装IIS Windows

    搭建网站-1-域名申请参见公众号 生物信息系统(swxxxt) 首先,已经拥有了一个可以正常使用的域名. 之前买了两年的阿里的服务器,由于是Windows的,最后不了了之了(因为当时找的代码都是lin ...

  10. mysql 创建用户及授权(1)

    一. 创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 说明: username:你将创建的用户名 host:指定该用户 ...