SpringCloud Hystrix超时:HystrixRuntimeException: xxx failed and no fallback available
报错描述:Spring Boot + Spring Cloud项目,微服务之间RPC调用,
使用Feign时经常出现执行超时的情况,抛出异常如下图:
com.netflix.hystrix.exception.HystrixRuntimeException: xxx方法 failed and no fallback available
主要原因如下:
1.未设置hystrix超时时间,默认是1000s
ribbon:OkToRetryOnAllOperations: false #对所有操作请求都进行重试,默认falseReadTimeout: 10000 #负载均衡超时时间,默认值5000ConnectTimeout: 2000 #ribbon请求连接的超时时间,默认值2000MaxAutoRetries: 0 #对当前实例的重试次数,默认0MaxAutoRetriesNextServer: 1 #对切换实例的重试次数,默认1hystrix:command:default: #default全局有效,service id指定应用有效execution:timeout:enabled: trueisolation:thread:timeoutInMilliseconds: 20000 #断路器超时时间,默认1000ms
由上面的测试可以得出:
- 如果hystrix.command.default.execution.timeout.enabled为true,则会有两个执行方法超时的配置,一个就是ribbon的ReadTimeout,一个就是熔断器hystrix的timeoutInMilliseconds, 此时谁的值小谁生效
- 如果hystrix.command.default.execution.timeout.enabled为false,则熔断器不进行超时熔断,而是根据ribbon的ReadTimeout抛出的异常而熔断,也就是取决于ribbon
- ribbon的ConnectTimeout,配置的是请求服务的超时时间,除非服务找不到,或者网络原因,这个时间才会生效
- ribbon还有MaxAutoRetries对当前实例的重试次数,MaxAutoRetriesNextServer对切换实例的重试次数, 如果ribbon的ReadTimeout超时,或者ConnectTimeout连接超时,会进行重试操作
- 由于ribbon的重试机制,通常熔断的超时时间需要配置的比ReadTimeout长,ReadTimeout比ConnectTimeout长,否则还未重试,就熔断了
- 为了确保重试机制的正常运作,理论上(以实际情况为准)建议hystrix的超时时间为:(1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeout
2.已设置超时时间,仍然在范围内熔断
检查下Feign接口是否有fallback实现类,当执行抛出异常时,没有触发fallback时,超时配置也是无效的(本人采坑了)
@Component
public class ServiceApiFeignFallbackFactory implements FallbackFactory<ServiceApiFeign> {private Logger logger = LoggerFactory.getLogger(ServiceApiFeignFallbackFactory.class);@Overridepublic ServiceApiFeign create(Throwable cause) {return new ServiceApiFeign() {@Overridepublic String get(String json) {logger.info(cause.getMessage());return null;}};}
}
以下为fallback触发的情况说明:
配置信息(default或HystrixCommandKey)最常用的几项
(1)hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
在调用方配置,被该调用方的所有方法的超时时间都是该值,优先级低于下边的指定配置
(2)hystrix.command.HystrixCommandKey.execution.isolation.thread.timeoutInMilliseconds
在调用方配置,被该调用方的指定方法(HystrixCommandKey方法名)的超时时间是该值
线程池核心线程数
hystrix.threadpool.default.coreSize(默认为10)
Queue
(1)hystrix.threadpool.default.maxQueueSize(最大排队长度。默认-1,使用SynchronousQueue。其他值则使用 LinkedBlockingQueue。如果要从-1换成其他值则需重启,即该值不能动态调整,若要动态调整,需要使用到下边这个配置)
(2)hystrix.threadpool.default.queueSizeRejectionThreshold(排队线程数量阈值,默认为5,达到时拒绝,如果配置了该选项,队列的大小是该队列)
注意:如果maxQueueSize=-1的话,则该选项不起作用
断路器
(1)hystrix.command.default.circuitBreaker.requestVolumeThreshold(当在配置时间窗口内达到此数量的失败后,进行短路。默认20个)
For example, if the value is 20, then if only 19 requests are received in the rolling window (say a window of 10 seconds) the circuit will not trip open even if all 19 failed.
简言之,10s内请求失败数量达到20个,断路器开。
(2)hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds(短路多久以后开始尝试是否恢复,默认5s)
(3)hystrix.command.default.circuitBreaker.errorThresholdPercentage(出错百分比阈值,当达到此阈值后,开始短路。默认50%)
fallback
hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests(调用线程允许请求HystrixCommand.GetFallback()的最大数量,默认10。超出时将会有异常抛出,注意:该项配置对于THREAD隔离模式也起作用)
属性配置参数
参数说明英文地址:https://github.com/Netflix/Hystrix/wiki/Configuration
SpringCloud Hystrix超时:HystrixRuntimeException: xxx failed and no fallback available相关推荐
- 深入了解SpringCloud Hystrix
雪崩效应即在多个服务节点当中,如果有一个服务不可用而这个不可用的服务导致整个应用资源都耗在这里,进而影响整个系统的崩溃.在分布式环境中,不可避免地会出现雪崩效应.Hystrix是一个netflix实现 ...
- Spring cloud报错com.netflix.hystrix.exception.HystrixRuntimeException
现象 生产环境,接口调用失败 feign客户端接口访问超时 查看服务正常,没有报错日志 仔细看了下,没有日志,应该是请求没有到达feign服务提供者 部分日志如下: com.netflix.hystr ...
- 关于Hystrix超时机制和线程状态的测试观察和个人理解
作者:未完成交响曲,资深Java工程师!目前在某一线互联网公司任职,架构师社区合伙人! 我们在使用Hystrix时,大部分情况下都是直接基于SpringCloud的相关注解来完成请求调用的.我们有个项 ...
- Dubbo(十五)springboot工程dubbo整合SpringCloud Hystrix
本章将编写一个使用SpringBoot工程集成dubbo使用hystrix组件实现服务熔断示例.包含服务提供者工程和服务消费者工程.主要在实现整合springcloud hystrix过程步骤如下: ...
- 【Java从0到架构师】SpringCloud - Hystrix、Zuul
SpringCloud 基本概念 熔断和降级 服务雪崩效应 服务熔断与降级 - Hystrix SpringBoot 集成 Hystrix 熔断降级服务异常报警通知 重点属性 - 熔断隔离策略.超时时 ...
- SpringCloud Hystrix熔断器
SpringCloud Hystrix熔断器 15.Hystrix熔断器:简介及作用 目标:理解Hystrix的作用 介绍:Hystrix,英文意思是豪猪,全身是刺,看起来就不好惹,是一种保护机制. ...
- com.netflix.hystrix.exception.HystrixRuntimeException
com.netflix.hystrix.exception.HystrixRuntimeException 关于Hystrix因超时导致的熔断,主要检查hystrix和ribbon两项配置 hystr ...
- com.netflix.hystrix.exception.HystrixRuntimeException总结
com.netflix.hystrix.exception.HystrixRuntimeException: PolicyFeignClient#getAgentFriend(List) failed ...
- Hystrix 超时配置重写
2019独角兽企业重金招聘Python工程师标准>>> @Configuration @ConditionalOnProperty(value = "spring.sleu ...
最新文章
- Apple高规格推3232吋LCD面板XDR
- opencv findContours 崩溃CrtDbgBreak
- Lucene 中的Tokenizer, TokenFilter学习
- 反病毒引擎设计全解(四)
- java 二维数组_Java中二维数组和异常的内容及应用
- 阿里云学生轻量级应用服务器安装MySQL
- 企业邮箱domino跟exchange
- Tomcat环境开发技巧
- db2字符串定位_DB2/Oracle/SQL server判断某个字符串或单个字符在源字符串中出现的位置...
- centos 最小化安装 补充命令_CentOS7安装后没网络的解决方法
- 操作系统——内存映射文件
- C# winform中 选择文件和保存文件
- web端前端自定义提示语信息
- 2021江苏考试院高考成绩查询入口,江苏省教育考试院2021年江苏高考成绩查询时间及系统入口...
- win 10 设置静态ip子网前缀长度的计算方法
- STL学习之路(一)
- 证券业数据大集中及其风险控制分析
- 绘制管理组织结构图方法介绍
- Gson系列1 --- Gson 序列化与反序列化 -- 数组 / 集合序列化
- CSS3多列布局 columns 弹性布局 flex