SpringCloud 之OpenFeign超时详解

首先OpenFeign集成了Ribbon、Hystrix,所以一般情况只需要引入OpenFeign就有负载均衡和熔断功能了。

 <dependency>
     <groupId>org.springframework.cloudgroupId>
     <artifactId>spring-cloud-starter-openfeignartifactId>
 dependency>

不开启Hystrix熔断超时说明

Ribbon超时默认配置,RibbonProperties:
在这里插入图片描述

# 连接超时时间,默认 2000 毫秒
ribbon.ConnectTimeout = 5000
# 逻辑处理超时时间,默认 5000 毫秒
ribbon.ReadTimeout = 10000
# 对当前实例的重试次数,默认0
ribbon.MaxAutoRetries = 0
# 对切换实例的重试次数,默认1
ribbon.MaxAutoRetriesNextServer=1 

Ribbon超时重试次数(总的请求次数):(MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1)

(0 + 1) *(1 + 1)= 1 * 2 = 2 共两次 所以默认是两次

开启Hystrix熔断超时说明

如果Feign开启了熔断,必须要重新设置熔断超时的时间,因为默认的熔断超时时间太短了,只有1秒,这容易导致业务服务的调用还没完成然后超时就被熔断了。

熔断器Hystrix,HystrixCommandProperties:

# Feign开启熔断,默认为false
feign.hystrix.enabled = true

# 是否开始超时熔断,true表示使用Hystrix熔断时间,false,表示服务不可用时才会使用Hystrix熔断时间,默认为true
hystrix.command.default.execution.timeout.enabled = true

# 设置超时熔断时间,只有设置了hystrix timeout enabled为true情况下,默认为1000毫秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 6000

Hystrix熔断最大时间的计算:

  • 开启了熔断时间,熔断时间到,就会调用熔断方法。
  • 未开启熔断时间,如果服务不可用,直接使用熔断时间,如果服务是可用的,使用Ribbon超时:(MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1) * (ConnectTimeout+ReadTimeout)

不管Hystrix是否熔断时间到了,Ribbon都会重试的,只不过熔断时间到了,Ribbon重试后重新得到的结果接收不到了。

如何配置好Hystrix和Ribbon的超时时间

feign.hystrix.enabled=false表示关闭熔断功能,hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds熔断超时不会生效。这时根据Ribbon配置进行执行。

feign.hystrix.enabled=true表示开启熔断功能,hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds熔断超时生效,hystrix超时时间优先级高于Ribbon超时时间,执行超过hystrix超时时间,返回熔断方法返回值。不会影响Ribbon进行重试。

Feign的请求: 其实是Hystrix+Ribbon。Hystrix在最外层,然后再到Ribbon,最后里面的是http请求。所以说。Hystrix的熔断时间必须大于Ribbon的 ( ConnectTimeout + ReadTimeout )。而如果Ribbon开启了重试机制,还需要乘以对应的重试次数,保证在Ribbon里的请求还没结束时,Hystrix的熔断时间不会超时。

所以Hystrix的熔断时间最好大于(MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1) * (ConnectTimeout+ReadTimeout)

OpenFeign使用Hystrix:

@Component
@FeignClient(fallback = CardTaskFeignHystrixImpl.class)
public interface CardTaskFeign {
	@RequestMapping(value = "/timeOut",method = RequestMethod.GET)
	String timeOut(@RequestParam(value = "mills") int mills);
}
@Component
public class CardTaskFeignHystrixImpl implements CardTaskFeign{
    @Override
    public String timeOut(int mills) {
        return "HystrixImpl return";
    }
}

启动出现 No fallback instance of type class found for feign client 异常解决方案:
在资源文件夹下面新建META_INF文件夹,新建spring.factories ,里面加上熔断类就可以了。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.pmd.www.chestnut.api.feign.CardTaskFeignHystrixImpl

你可能感兴趣的:(SpringCloud,http,restful,java)