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

具有Hystrix断路器超时默认值为2秒的Spring Cloud FlygnClient客户端

翟高明
2023-03-14

可通过GitHub上的项目重现:spring-Cloud-feign-hystrix-timeout-问题

我使用的是Spring Boot2.3.1。用Spring云释放。SR6。也就是说,没有Zuul和Eureka获取其余响应的假客户和Hystrix。

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-dependencies</artifactId>
   <version>Hoxton.SR6</version>
   <type>pom</type>
   <scope>import</scope>
</dependency>

然后我在Spring Boot2.3.1之上使用以下依赖项。RELEASESpring Cloud Hoxton。SR6

  • org.springframework.bootspring-boot-starter
  • org.springframework.bootspring-boot-starter-web
  • org.springframework.cloudSpring-Cloud-starter-openfeign
  • org.springframework.cloudspring-Cloud-starter-Netflix-hystrix

我启用了EnableFeignClients和EnableCircuitBreaker,并使用了一个简单的回退来记录和重新显示异常:

@FeignClient(name="my-feign", url = "${feign.url}", fallbackFactory = MyFallbackFactory.class) {
public interface MyFeignClient {

    @PostMapping(value = "/api/dto")
    postDto(@RequestBody Dto dto);
}

使用以下应用程序。yml超时约为1秒,因为Hystrix默认为非常相同的值:

feign:
  hystrix:
    enabled: true
  client:
    config:
      default:
        connectTimeout: 5000
        readTimeout: 5000

11: 52:05.493信息10200---[nio-8060-exec-2]com。我的公司。Rest我的控制员:马上呼叫REST!

11: 52:06.538错误24044---[nio-8060-exec-1]o.a.c.c.c.[]。[dispatcherServlet]:Servlet。路径为[]的上下文中servlet[dispatcherServlet]的service()引发了异常[Request processing failed;嵌套异常为com.netflix.hystrix.exception.HystrixRuntimeException:MyFeignClient#postDto(Dto)超时,回退失败。]有根本原因

我尝试了什么?

只要我添加以下几行以将超时增加到60秒,超时就会有效地变为2秒左右:

hystrix:
  command:
    default:
      execution:
        timeout:
          enabled: true
        isolation:
          thread:
            timeoutInMilliseconds: 60000

11: 53:33.590信息16052---[nio-8060-exec-2]com。我的公司。Rest我的控制员:马上呼叫REST!

11: 53:35.614错误16052---[nio-8060-exec-2]o.a.c.c.c.[/]。[dispatcherServlet]:Servlet。路径为[]的上下文中servlet[dispatcherServlet]的service()引发了异常[Request processing failed;嵌套异常为com.netflix.hystrix.exception.HystrixRuntimeException:MyFeignClient#postDto(Dto)failed and fallback failed]有根本原因

只要增加了Hystrix读取/连接超时,调用就会在2秒内进入回退状态。但是,只要我在feign.client.config.default.中声明它,我希望达到5秒。超时。我觉得我错过了另一个配置。

Q: 如何增加超时?

编辑:

  • mvn依存关系:树:https://pastebin.com/LJFGaMTc
  • <代码>pom。xml:https://pastebin.com/98uXHTaR
  • 堆栈跟踪:https://pastebin.com/7rQweC8w

共有2个答案

吕鹏
2023-03-14

您可以尝试在一行中定义Hystrix timeout的配置属性(我知道它应该与您在YAML文件中提出的嵌套定义等效,但有时我会遇到仅以这种方式加载的属性)。正如您在他们的测试中所看到的,这是Spring Cloud本身配置Hystrix超时的方式:

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000

此外,尽管您表示没有使用Zuul或Eureka,请验证您是否以任何方式使用Ribbon,但存在一些依赖关系(请参阅)https://github.com/Netflix/Hystrix/issues/1778和https://github.com/spring-cloud/spring-cloud-netflix/issues/1324)在Hystrix和Ribbon超时之间。

如果是这种情况,则必须配置两个库的超时:

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000
ribbon:
  ConnectTimeout: 5000
  ReadTimeout: 5000
游乐池
2023-03-14
匿名用户

您的配置是正确的,您所描述的是预期行为。这里的问题是,在配置的超时(10秒)之后,不会引发连接被拒绝的异常。相反,它是在Java的内部套接字实现发现服务器主机不可访问后立即抛出的。在最简单的情况下,您调用的服务器没有启动并运行。

至于为什么在设置hystrix超时后会出现第二次增加,您可以调试hystrix的调用堆栈,以发现HystrixRuntimeException的抛出顺序不同。

在自定义hystrix超时之前,hystrix的默认超时为1秒,这意味着自执行结束后1秒内始终引发此运行时异常,无论请求是否成功。因此,在您的情况下,连接被拒绝很可能发生在HystrixTimeoutException之后。当您将超时设置为比外部客户端的超时更长时,只有在抛出外部异常(由于“连接被拒绝”)后才会创建HystrixTimeoutException,因此会产生延迟。

// 'cause' should be different due to timing
public HystrixRuntimeException(... Exception cause, Throwable fallbackException)

为了模拟超时,可以在服务器上强制超时,例如线程。sleep(6000)停止服务器端的执行,或者在调试器上执行断点。

 类似资料:
  • Netflix的创造了一个调用的库Hystrix实现了断路器图案。在微服务架构中,通常有多层服务调用。 图1.微服务图 较低级别的服务中的服务故障可能导致用户级联故障。当对特定服务的呼叫达到一定阈值时(Hystrix中的默认值为5秒内的20次故障),电路打开,不进行通话。在错误和开路的情况下,开发人员可以提供后备。 图2. Hystrix回退防止级联故障 开放式电路会停止级联故障,并允许不必要的或

  • 当使用包含Ribbon客户端的Hystrix命令时,您需要确保您的Hystrix超时配置为长于配置的Ribbon超时,包括可能进行的任何潜在的重试。例如,如果您的Ribbon连接超时为一秒钟,并且Ribbon客户端可能会重试该请求三次,那么您的Hystrix超时应该略超过三秒钟。 如何包含Hystrix仪表板 要在项目中包含Hystrix仪表板,请使用组org.springframework.cl

  • SOFARPC 已集成 Hystrix 提供熔断能力,当前提供第一个预览版。关于 Hystrix 的更多介绍可以参考 Hystrix 官方文档,Hystrix 集成能力主要由 ScienJus 提供,感谢贡献。 接下来介绍一下如何体验 Hystrix 带来的熔断能力,以下示例使用 SOFARPC 5.5.0 版本,更多 Hystrix 的配置及 SOFABoot 集成使用方式将在后续版本提供,敬请

  • 应用程序可以使用Spring Cloud Netflix项目提供的Hystrix断路器将这个启动器包含在项目pom.xml:spring-cloud-starter-hystrix中。Hystrix不依赖于Netflix Discovery Client。@EnableHystrix注释应放置在配置类(通常是主类)上。那么方法可以用@HystrixCommand注释来被断路器保护。有关详细信息,请

  • 问题内容: 我似乎有时会遇到一些tcp请求被“卡住”的麻烦,就像它正在等待一些响应,但连接已被“切断”,因此响应永远不会到来。这是具有默认超时的HttpURLConnection的预期行为吗?是否设置了明智的默认设置,以便默认情况下我无法进入这种奇怪的“挂起”情况? 问题答案: 出现HttpURLConnection的“默认”超时为零,表示“无超时”。 不幸的是,根据我的经验,根据您与服务器的连接

  • 我在我的spring boot应用程序中使用Hystrix实现断路器,我的代码如下所示: 我看到每次失败时都会调用fallback()。但3次故障后电路不开。在3次失败之后,我原以为它会直接调用并跳过。但这并没有发生。有人能告诉我我在这里做错了什么吗? 谢谢,B Jagan 下面是实际代码。我用这个玩得更远了。当我在RegistrationHystrix.RegisterSeller()方法中直接