Симулирующий клиент выдает исключение HystrixTimeoutException, даже если базовый запрос выполнен успешно

#spring-boot #microservices #hystrix #feign

#spring-boot #микросервисы #hystrix #симулировать

Вопрос:

У меня есть такой фиктивный клиент с конечными точками для двух API-интерфейсов из PROJECT-SERVICE

 @FeignClient(name = "PROJECT-SERVICE", fallbackFactory = ProjectServiceFallbackFactory.class)
public interface ProjectServiceClient {
    
    @GetMapping("/api/projects/{projectKey}")
    public ResponseEntity<Project> getProjectDetails(@PathVariable("projectKey") String projectKey);

    @PostMapping("/api/projects")
    public ResponseEntity<Project> createProject(@RequestBody Project project);
}
  

Я использую эти клиенты следующим образом:

 @Service
public class MyService {
  
    @Autowired
    private ProjectServiceClient projectServiceClient;


    public void doSomething() {
         // Some code
         ResponseEntity<Project> projectResponse = projectServiceClient.getProjectDetails(projectKey);
         // Some more code
    }

    public void doSomethingElse() {
         // Some code
         ResponseEntity<Project> projectResponse = projectServiceClient.createProject(Project projectToBeCreated);
         // Some more code
    }
}
  

Моя проблема в том, что в большинстве случаев (примерно в 60% случаев) любой из этих ложных вызовов приводит HystrixTimeoutException к.

Сначала я думал, что может быть проблема в нисходящей микросервисе (в данном случае PROJECT-SERVICE), но это не так. Фактически, когда getProjectDetails() createProject() вызывается or, PROJECT-SERVICE фактически выполняет задание и возвращает a ResponseEntity<Project> со статусом 200 и 201 соответственно, но мой запасной вариант активируется с HystrixTimeoutException помощью .

Я тщетно пытаюсь найти, что может быть причиной этой проблемы.

Однако у меня это есть в моей основной конфигурации приложения:

 feign.hystrix.enabled=true
feign.client.config.default.connect-timeout=5000
feign.client.config.default.read-timeout=60000
  

Кто-нибудь может указать мне на решение?

Спасибо, Шрирам Шридхаран

Ответ №1:

Тайм-аут Hystrix не привязан к тайм-ауту Feign. Для Hystrix по умолчанию включен тайм-аут выполнения в 1 секунду. Вам необходимо настроить этот тайм-аут так, чтобы он был немного длиннее, чем у Feign, чтобы избежать HystrixTimeoutException выброса раньше желаемого тайм-аута. Вот так:

 feign.client.config.default.connect-timeout=5000
feign.client.config.default.read-timeout=5000
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=6000
  

Это позволило бы FeignException сначала вызвать тайм-аут через 5 секунд, а затем обернуть HystrixTimeoutException