如何解决即使基础请求成功,Feign Client也会引发HystrixTimeoutException
我有一个像这样的假客户端,它的端点指向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
的{{1}},但是我的后备广告是通过201
激活的。
我正在徒劳地寻找可能导致此问题的原因。
但是,我在我的主要应用程序配置中有此设置:
HystrixTimeoutException
有人可以指出我的解决方案吗?
谢谢, 斯里拉姆·斯里达拉恩
解决方法
Hystrix的超时与Feign的超时无关。 Hystrix默认启用1秒执行超时。您需要将此超时配置为比Feign的超时稍长,以避免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
,然后将其包裹在{{1}}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。