一、问题描述

如果我们线上有一些方法需要单独设置超时时间,比如:批量处理任务,上传文件等。

二、解决方案

注:以下方案是根据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。

查看原文