即使底层请求成功,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&lt;Project&gt;,其状态分别为200201,但我的后备是使用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的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Feign 组成和配置

为啥即使我 .catch() Promise.all() 也会抛出异常?

为啥即使元素存在,硒也会抛出未找到元素的错误? [复制]

为啥即使使用了调用,组合框也会抛出异常

2021年Java面试总结题

2021年Java面试总结题