首先OpenFeign集成了Ribbon、Hystrix,所以一般情况只需要引入OpenFeign就有负载均衡和熔断功能了。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
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 共两次 所以默认是两次
如果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熔断最大时间的计算:
(MaxAutoRetries+1)*(MaxAutoRetriesNextServer+1) * (ConnectTimeout+ReadTimeout)
。不管Hystrix是否熔断时间到了,Ribbon都会重试的,只不过熔断时间到了,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