我有一个Spring Boot应用程序,该应用程序通过hystrix命令使用后备方法迭代地调用mockserver实例。

模拟服务器配置为始终以状态代码500响应。在没有circuitBreaker.sleepWindowInMilliseconds的情况下运行时,一切正常,对模拟服务器的调用完成,然后调用fallback方法。

在将circuitBreaker.sleepWindowInMilliseconds值配置为大约5分钟之后,我希望在5分钟内不会对模拟服务器执行任何调用,所有调用都将定向到回退方法,但是事实并非如此。

看起来circuitBreaker.sleepWindowInMilliseconds配置被忽略了。

例如,如果我将模拟服务重新配置为在迭代仍在运行时以状态代码200答复,它将立即打印“模拟服务响应”,而无需等待5分钟。

在spring boot主应用程序类中:

@RequestMapping("/iterate")
  public void iterate() {
    for (int i = 1; i<100; i++ ) {
      try {
        System.out.println(bookService.readingMockService());
        Thread.sleep(3000);
      } catch (Exception e) {
        System.out.println(e.getMessage());
      }
    }
  }

在 Spring 启动服务中:
@HystrixCommand(groupKey = "ReadingMockService", commandKey = "ReadingMockService", threadPoolKey = "ReadingMockService", fallbackMethod = "reliableMock", commandProperties = {
          @HystrixProperty(name ="circuitBreaker.sleepWindowInMilliseconds", value = "300000") })
  public String readingMockService() {
    URI uri = URI.create("http://localhost:1080/askmock");
    return this.restTemplate.getForObject(uri, String.class);
  }

模拟服务器也在同一台机器上运行,其配置如下:
new MockServerClient("127.0.0.1", 1080).reset();
   new MockServerClient("127.0.0.1", 1080)
           .when(request("/askmock"))
           .respond(response()
                   .withStatusCode(500)
                   .withBody("mockservice response")
                   .applyDelay());

最佳答案

发现问题:
此属性(... circuitBreaker.sleepWindowInMilliseconds)与另一个属性(... circuitBreaker.requestVolumeThreshold)一起使用。
如果未特别设置,则默认设置为20,这意味着第一个hystrix将尝试以通常的方式进行20次连接,并且只有在此之后,sleepWindowInMilliseconds才会被激活,并且仅进入后备状态。

此外,仅当失败调用的百分比超过circuitBreaker.errorThresholdPercentage时,电路中断才会打开
并且同时失败调用的总数超过了circuitBreaker.requestVolumeThreshold,所有这些都在metrics.rollingStats.timeInMilliseconds窗口内

09-25 20:14