【问题标题】:Feign Client throws HystrixTimeoutException even though the underlying request is successful即使底层请求成功,Feign Client 也会抛出 HystrixTimeoutException
【发布时间】: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

谁能指出我的解决方案?

谢谢, 斯里拉姆斯里达兰

【问题讨论】:

    标签: spring-boot microservices hystrix feign


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 2021-06-28
      • 1970-01-01
      • 2020-02-16
      • 2012-08-08
      • 1970-01-01
      • 2016-11-12
      相关资源
      最近更新 更多