#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