Воспроизводится в проекте на GitHub: spring-cloud-feign-hystrix-timeout-problem
Я использую Spring Boot 2.3.1.RELEASE
с Spring Cloud Hoxton.SR6
. А именно Feign client и Hystrix без Zuul и Eureka для получения ответов REST.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR6</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Затем я использую следующие зависимости поверх Spring Boot 2.3.1.RELEASE
и Spring Cloud Hoxton.SR6
:
org.springframework.boot
: spring-boot-starter
org.springframework.boot
: spring-boot-starter-web
org.springframework.cloud
: spring-cloud-starter-openfeign
org.springframework.cloud
: spring-cloud-starter-netflix-hystrix
Я включаю @EnableFeignClients
и @EnableCircuitBreaker
и использую @FeignClient
с простым откатом для регистрации и повторной генерации исключения:
@FeignClient(name="my-feign", url = "${feign.url}", fallbackFactory = MyFallbackFactory.class) {
public interface MyFeignClient {
@PostMapping(value = "/api/dto")
postDto(@RequestBody Dto dto);
}
со следующим application.yml
таймаутом составляет около 1 секунда , потому что Hystrix по умолчанию имеет то же значение:
feign:
hystrix:
enabled: true
client:
config:
default:
connectTimeout: 5000
readTimeout: 5000
11: 52: 05.493 INFO 10200 --- [nio-8060-exe c -2] com.mycompany.rest.MyController: вызов REST прямо сейчас!
11: 52: 06.538 ОШИБКА 24044 --- [nio-8060-exe c -1] oa c. c. C. [. [. [/]. [DispatcherServlet]: Servlet.service () для сервлета [dispatcherServlet] в контексте с путем [] сгенерировал исключение [Ошибка обработки запроса; вложенное исключение - com.netflix.hystrix.exception.HystrixRuntimeException: MyFeignClient # postDto (Dto) истекло время ожидания и откат не удалось.] с root причиной
Что я пробовал?
Пока я добавляю следующие строки для увеличения тайм-аута до 60 секунд, тайм-аут становится примерно 2 секунды :
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 60000
11: 53: 33.590 ИНФОРМАЦИЯ 16052 --- [nio-8060-exe c -2] com.mycompany.rest.MyController: вызов REST прямо сейчас!
11: 53: 35.614 ОШИБКА 16052 --- [nio-8060-exe c -2] oa c. c. C. [. [. [/]. [DispatcherServlet]: Servlet .service () для сервлета [dispatcherServlet] в контексте с путем [] выдал исключение [Ошибка обработки запроса; вложенное исключение - com.netflix.hystrix.exception.HystrixRuntimeException: MyFeignClient # postDto (Dto) не удалось и откат не удалось.] с root причиной
Вызов переходит в резервный прямо в 2 секунд до тех пор, пока таймауты чтения / подключения Hystrix были увеличены. Однако я ожидаю достичь 5 секунд , если я объявил это в feign.client.config.default...
тайм-аутах. Я чувствую, что мне не хватает другой конфигурации.
Q: Как увеличить время ожидания?
Изменить: