FeignCilent超时设置
方案一:Ribbon超时设置
feign是集成ribbon的,默认是用的ribbon的超时时间1s。我们可以通过在调用者的配置文件中修改ribbon默认超时时间:
#请求处理的超时时间
ribbon:
#指的是建立连接后从服务器读取到可用资源所用的时间
ReadTimeout: 2000
#指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间
ConnectTimeout: 2000
方案二:Feign超时设置
注意:Feign超时设置会覆盖ribbon超时时间。
- 全局配置,对使用FeignClient的微服务生效
feign:
client:
config:
default:
connectTimeout: 10000 #单位毫秒
readTimeout: 10000 #单位毫秒
- 指定微服务配置,将default替换成具体微服务名称:即对指定微服务生效,例如commodity-service
feign:
client:
config:
commodity-service:
connectTimeout: 10000 #单位毫秒
readTimeout: 10000 #单位毫秒
- 指定微服务中指定方法或方法集设置超时时间
举例:商品服务调用交易服务中的getOrderById方法经常超时,只想对这个方法设置超时时间,但是不影响全局配置超时时间。在实际项目中一个微服务会有多个FeignClient,我们需要对每个FeignClient设置别名,标识全局唯一性,利用@FeignClient的属性contextId设置:如图
@FeignClient(
contextId = "remoteOrderService",
value = ServiceNameConstants.DEAL_SERVICE,
fallbackFactory = RemoteOrderServiceFallbackFactory.class
)
public interface RemoteOrderService {
@GetMapping("/v1/deal-order/{id}")
R<Order> getOrderById(@PathVariable("id") Long id);
}
当一个微服务会有多个FeignClient,不设置别名会报错:如图
Description:
The bean 'deal-service.FeignClientSpecification', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
虽然可以设置spring.main.allow-bean-definition-overriding=true,来允许出现beanName一样的BeanDefinition,但是不推荐。
因此针对某个方法设置超时时间,如图(注意:配置必须在调用者且是优先级高的的配置文件中)
##自定义feign client超时时间
feign:
client:
config:
#对应feign client的contextId
remoteOrderService:
connectTimeout: 10000
readTimeout: 3000
在springcloud项目中有config server(配置中心),在基于本地项目存储配置文件的配置信息优先级问题:如图
本项目gitee地址:springcloud-demo