即使底层请求成功,Feign Client 也会抛出 HystrixTimeoutException
Posted
技术标签:
【中文标题】即使底层请求成功,Feign Client 也会抛出 HystrixTimeoutException【英文标题】:Feign Client throws HystrixTimeoutException even though the underlying request is successful 【发布时间】:2021-01-06 01:55:33 【问题描述】:我有一个像这样的假客户端,其端点连接到来自 PROJECT-SERVICE 的两个 API
@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% 的时间),这些 Feign 调用中的任何一个都会导致 HystrixTimeoutException
。
我最初以为下游微服务(本例中为 PROJECT-SERVICE)可能有问题,但事实并非如此。事实上,当getProjectDetails()
或createProject()
被调用时,PROJECT-SERVICE 实际上完成了这项工作并返回了一个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
中
【讨论】:
以上是关于即使底层请求成功,Feign Client 也会抛出 HystrixTimeoutException的主要内容,如果未能解决你的问题,请参考以下文章