天天看点

解决时间格式导致的Hystrix circuit short-circuited and is OPEN问题问题描述解题思路&解题过程解题思考

解决Hystrix circuit short-circuited and is OPEN问题

  • 问题描述
  • 解题思路&解题过程
    • 延申问题
    • 延申问题解题思路
  • 解题思考

问题描述

使用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啦,两个原因:

  1. 被调用的接口没有这个服务。
  2. 由于请求参数过长导致为问题。

第一个原因很简单,直接排查被调用服务是否有该接口。悟空这边没有这个问题,略过~

第二个原因常见使用@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 报错根本原因是否是请求参数,
接口无法接收导致,可能与长度无关,长度过长只是无法接收的一个原因。