您现在的位置是:首页 >技术教程 >Hystrix Feign Ribbon设置单独接口的超时时间网站首页技术教程
Hystrix Feign Ribbon设置单独接口的超时时间
一、问题描述
如果我们线上有一些方法需要单独设置超时时间,比如:批量处理任务,上传文件等。
二、解决方案
注:以下方案是根据openfegin10.2版本,不同版本可能会有所不同,请自行测试。
1、第一步先了解下Hystrix Feign Ribbon超时时间关系
1)、若不设置了Hystrix,Feign 和 Ribbon 的超时时间,则这三个默认都是1s,而Ribbon重试机制不会触发。
2)、若设置了Hystrix的超时时间,不设置Feign 和 Ribbon 的超时时间,则以hystrix的超时时间为准,而Ribbon重试机制不会触发。
3)、若设置了Feign 和 Ribbon 的超时时间只会有一个生效,规则:如果没有设置过 Feign 超时,也就是等于默认值的时候,就会读取 Ribbon 的配置,使用 ribbon 的超时时间和重试设置。否则使用 Feign 自身的设置。两者是二选一的,且 feign 优先。一般来说,会设置 Feign或Ribbon 的超时时间 < Hystrix,若超出了Feign或者ribbon 的超时限制,或者 超出了Hystrix 的超时限制,那么就会熔断。
2、解决方案
1)、若只设置了Hystrix的超时时间,不设置Feign 和 Ribbon 的超时时间,则可以用以下方式设置单个接口超时时间。
hystrix:
类名#方法名(参数类型):
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 超时时间
2)、若设置了Feign的超时时间(需小于Hystrix超时时间),则可以用以下方式设置单个接口超时时间。
@FeignClient(value = "微服务名", contextId = "唯一标识")
public interface TestFeign {
}
配置如下:
feign:
client:
config:
唯一标识:
connectTimeout: 连接超时时间
readTimeout: 读取超时时间
注:contextId唯一标识,当一个微服务中存在多个FeignClient接口调用同一个服务提供者时的场景(若是不提供该属性值,则在程序启动时会启动报错) ,一定要使用注解@EnableFeignClients,开启Feign。
2)、若设置了Ribbon的超时时间(需小于Hystrix超时时间),则可以用以下方式设置单个接口超时时间。
@FeignClient(value = "微服务名", contextId = "唯一标识")
@RibbonClient(name = "客户端唯一标识")
public interface TestFeign {
}
配置如下:
ribbon客户端唯一标识:
ribbon:
ConnectTimeout: 连接超时时间
ReadTimeout: 读取超时时间
注:若存在多个RibbonClient名称相同的name,则启动报错,一定要使用注解@RibbonClient ,开启Ribbon。