Hystrix、Ribbon、Feign 源码剖析(一)引子
Hystrix、Ribbon、Feign 源码剖析(二)原理概括
Hystrix、Ribbon、Feign 源码剖析(三)源码详解
Hystrix、Ribbon、Feign 源码剖析(四)总结提高
前几天线上服务出现调用失败,架构是spring cloud Greenwich.SR4版本,使用feign调用.线上日志排查后发现:feign client调用微服务一秒就自动超时失败。上网搜了一下,说hystrix默认超时配置就是1秒,加了如下配置,问题解决:
#Feign
#使用apahce httpclient 连接池
feign:
httpclient:
enabled: true
hystrix:
enabled: true
#超时处理
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
thread:
timeoutInMilliseconds: 30000
# 全局ribbion超时配置
ribbon:
ConnectTimeout: 10000
ReadTimeout: 10000
如上图所示:
1.feign.hystrix.enabled=true 代表开启熔断器
2.hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=30000 熔断器超时毫秒数,30秒(默认1000)
公式如下:
Hystrix的超时时间=Ribbon的重试次数(包含首次) * (ribbon.ReadTimeout + ribbon.ConnectTimeout)
这个超时,有什么官方佐证呢?
查询 spring cloud官网后,找到如下一段:
翻译如下:
hystrix超时>ribbon超时(包含潜在的重试时间),例如ribbon连接超时1秒,重试3次,所以Hystrix超时必须>3秒
揭露一下我的解决问题步骤,希望能给大家带来一点解决问题的思路。
咱们采用三步骤:发现问题、分析问题、解决问题。
这里无非2个重点:
结束了吗?
经过阅读官方文档,发现Spring boot所有的jar包,代码自动补全配置在:spring-configuration-metadata.json或者additional-spring-configuration-metadata.json
。前者是编译时自动生成的,后者是手动自定义的。后者可覆盖前者。(但是这也只是部分配置!!!大量细节配置在源码中!!!聊胜于无吧!!!)
IDEA中properties、yml文件中可以下拉提示有哪些配置。如下图:
具体看一下additional-spring-configuration-metadata.json
内容如下:
如上图:
feign.hysgtrix.enabled 如果为true,开启hystrix熔断器。默认为false,不开启。
feign.httpclient.enabled 开启使用apache http client 连接池,默认开启。
问题来了,并没发现第一节的配置。
老老实实地阅读源码后:
在hysyrix-core-1.5.18.jar(在spring-cloud-starter-netflix-hystrix:2.1.4.RELEASE中 )中终于发现了配置类HystrixCommandProperties
果然是默认1秒,终于实锤了。
本系列文章就是一次解决问题的实践。通过阅读官方文档+源码,彻底摸清Spring Cloud Hystrix+Ribbon+Feign的老底儿。后续章节,就是我们一步步解决问题的过程。
再次重申,技术容不得偷懒!!!
Hystrix、Ribbon、Feign 源码剖析(一)引子
原文:https://www.cnblogs.com/dennyzhangdd/p/12418927.html