当前位置: 首页 > 知识库问答 >
问题:

假装客户端抛出HystrixTimeoutException,即使基础请求成功

王骏
2023-03-14

我有一个这样的假客户机,它的endpoint指向来自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
    }
}

我最初以为下游的微服务(本例中为PROJECT-SERVICE)可能出了问题,但事实并非如此。事实上,当调用GetProjectDetails()CreateProject()时,PROJECT-SERVICE实际上执行了该作业,并返回状态分别为200201ResponseEntity ,但我的回退是用HystrixTimeoutException激活的。

我在徒劳地寻找是什么引起了这个问题。

然而,我在我的主要应用程序配置中有以下内容:

feign.hystrix.enabled=true
feign.client.config.default.connect-timeout=5000
feign.client.config.default.read-timeout=60000

谢谢Sriram Sridharan

共有1个答案

袁羽
2023-03-14

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

这样做将允许首先抛出由5秒后超时引起的FeignException,然后包装在HystrixTimeoutException

 类似资料:
  • 我需要多次调用服务(>50次)并聚合响应。因此,我决定使用,使用Async和CustomExecuter(它自己的线程池)来提高速度,而不是等待服务响应。 我在类路径上使用带有ApacheHTTP和Hystrix的feign客户机。我可以看到它有时是工作的,有时我得到例外,因为电路是开放的。

  • 假客户端支持可选请求参数吗? 例如,我有一个endpoint,但我没有找到一种方法,可以使用feign client使param1成为可选的。

  • 我对假装很陌生。今天就发现吧……当我读到Spring Cloud Feign时,我的第一个问题是:“您如何包装您的Fiign客户机?” 我举个例子。假设我们有2个微服务M1和M2。M2使用来自M1的endpoint。 null 也许我完全错了,请指正。 多谢!拜拜

  • 我有一个带有spring后端的Vue.js应用程序,它通过一个虚假的客户端向一个“订单”微服务打电话。我有许多使用@PathVariable运行良好的GET请求,但我有一个GET请求,它可以传递任意数量的不同URL参数,并且定义了一个OrderListItemParameters类并将其添加到GET请求中,以便将这些参数传递给微服务。我可以看到请求正在发送到微服务,但它被拒绝,出现了“org.za

  • 客户端的HTTP/HTTPS请求。 进程:主进程​ ClientRequest是由EventEmitter来实现Writable Stream​ new ClientRequest(options) 作用:发起新的HTTP/HTTPS请求 options(Object | String) - options是String时即请求URL。 options 是Object时则按以下属性请求: meth

  • 使用Spring云合同验证生产者和消费者之间的合同。在我的消费者控制器中,我正在使用Feign client调用另一个微服务方法来获取一些数据。但是现在在SpringCloud contract中,为这个微服务进行存根调用是不可能的。 使用Spring Cloud与Netflix OSS。