解决时间格式导致的Hystrix circuit short-circuited and is OPEN问题
解决Hystrix circuit short-circuited and is OPEN问题问题描述解题思路&解题过程延申问题延申问题解题思路解题思考问题描述使用Spring Cloud Fegin调用内部接口时报错:Hystrix circuit short-circuited and is OPEN(服务调用短路熔断)解题思路&解题过程 &n
问题描述
使用Spring Cloud Fegin调用内部接口时报错:Hystrix circuit short-circuited and is OPEN
(服务调用短路熔断)
解题思路&解题过程
解题思路:该问题是由于服务之间Fegin接口调用,连续调用失败二十次以上导致的Hystrix服务熔断导致的问题,被调用方此时会拒绝外部对该接口的调用,拒绝时间默认5秒钟。
首先考虑自己的服务接口,请求本身就具有失败的可能,允许失败但不允许服务熔断,此时可以对被调用服务设置hystrix。这里我允许失败次数时1000个,这个数值过大可能会引起服务雪崩,具体要根据自己的实际情况设置。
当然我这里并不允许存在失败的情况,要找出失败的原因
#负载配置
ribbon:
#负载均衡超时设置和请求的超时
ReadTimeout: 60000
SocketTimeout: 60000
#熔断配置
hystrix:
command:
default:
#断路器超时设置和请求的超时
execution:
isolation:
thread:
timeoutInMilliseconds: 60000
#设置熔断器失败的个数
circuitBreaker:
requestVolumeThreshold: 1000
#设置核心线程数
threadpool:
default:
maxQueueSize: 1000
延申问题
向上排查最初错误的时候发现报错:feign.FeignException$BadRequest: status 400 reading XXX
延申问题解题思路
这个问题是Fegin调用的时候接口调用404啦,两个原因:
- 被调用的接口没有这个服务。
- 由于请求参数过长导致为问题。
第一个原因很简单,直接排查被调用服务是否有该接口。悟空这边没有这个问题,略过~
第二个原因常见使用@param传参,会导致参数过长,所以采用application/json传参,使用@RequestBody接受参数,将参数使用该方法传参,获取请求参数为{"endTime":"2021-03-23 00:00:00","startTime":"2021-03-22 00:00:00","tenantId":1}
,参数并不长,问题还是没有解决。
继续排查,尝试对时间格式处理,加上注解如下,对时间进行格式化
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date startTime;
至此问题解决。
解题思考
出现Hystrix circuit short-circuited and is OPEN,一定要排查请求失败原因。
思考:FeignException$BadRequest: status 400 reading XXX 报错根本原因是否是请求参数,
接口无法接收导致,可能与长度无关,长度过长只是无法接收的一个原因。
更多推荐
所有评论(0)