微服务调用feign.RetryableException超时问题

笔者在开发代码过程中,涉及到两个微服务之间的调用,但是有如下报错:

feign.RetryableException:Read timed out executing POST http://********

1. 问题原因

这个是由于spring cloud feign超时配置导致的。
默认配置
在没有做特定配置的情况下,feign的默认超时时间是1秒

2. 解决方法

feign的超时配置有很多,有feign自身的,也有ribbon相关的。超时主要有两类配置:一个是连接超时,一个是读取超时。
Feign相关配置

feign.client.config.default.readTimeout=10000
feign.client.config.default.connectTimeout=7000

是Feign的全局超时配置。也可以为特定feign设置超时时间,只要把default换成(某个服务的名称,也为contextId)feign client的name就可以了。此处可以参考第3点。
这里有一个要注意的点就是如果只配置了连接超时或者读取超时其中一个是不会生效的,必须在配置文件中对这两类超时全部配置才会生效

Ribbon相关配置
ribbon中也有超时相关配置,分别是

ribbon.ReadTimeout=10000
ribbon.ConnectTimeout=7000

Feign 和 Ribbon 的超时时间只会有一个生效,规则:如果没有设置过 feign 超时,也就是等于默认值的时候,就会读取 ribbon 的配置,使用 ribbon 的超时时间和重试设置。否则使用 feign 自身的设置。两者是二选一的,且 feign 优先。

3. 为特定feign设置超时时间

官方文档描述如下,对于2中的配置,只要把default换成即可,替换成什么呢?取决于@FeignClient中的value,其也有name或者contextId的别名。
微服务调用feign.RetryableException超时问题_第1张图片
对于如下代码,如果你把default替换为name的值test是不生效的,而替换为contextId的值testFeign则生效。

@FeignClient(name = "test", contextId = "testFeign")
public interface TestFeign {
 
    @GetMapping("/admin/v1/test/{test}")
    R getTestInfo(@PathVariable("id") Integer test);

参考内容:
https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#timeout-handling
https://blog.csdn.net/weixin_40404683/article/details/127729875

你可能感兴趣的:(Java技术积累,微服务,java,spring)