簡體   English   中英

增加 Hystrix 斷路器超時?

[英]Increase Hystrix Circuit Breaker Timeout?

我有一個 Hystrix Circuit Breaker 的實現,在測試時我收到了一個 Hystrix 運行時異常,錯誤是 The CircuitBreker 超時和回退失敗。 我是否需要增加 CircutBreaker 的超時時間? 如果代碼超時,它是否應該使斷路器跳閘?

我的junit測試如下:

@Test
public void test4(){
    client = new DefaultHttpClient();
    httpget = new HttpGet("http://www.google.com:81");
    resp = new CircuitBreaker(client, "test4", httpget).execute();
    //assertEquals(HttpStatus.SC_GATEWAY_TIMEOUT, resp.getStatusLine().getStatusCode());
    System.out.println(resp.getStatusLine().getStatusCode());
}

我的班級只是在以某種方式失敗時使用斷路器運行 web 獲取/放置/等。 我的課如下:

public class CircuitBreaker extends HystrixCommand<HttpResponse> {
 private HttpClient client;
 private HttpRequestBase req;
 protected String key;
//Set up logger
 private static final Logger logger = (Logger)LoggerFactory.getLogger(CircuitBreaker.class);

  /*
  * This method is a constructor and sets http client based on provides args.
  * This version accepts user input Hystrix key.
  */
  public CircuitBreaker (HttpClient client, String key, HttpRequestBase req, int threshold) {
      super(HystrixCommandGroupKey.Factory.asKey(key));
      this.client = client;
      this.key = key;
      this.req = req;
      logger.info("Hystrix Circut Breaker with Hystrix key:" + key);
      logger.setLevel(Level.DEBUG);
      HystrixCommandProperties.Setter().withCircuitBreakerEnabled(true);
      HystrixCommandProperties.Setter().withCircuitBreakerErrorThresholdPercentage(threshold);
      //HystrixCommandProperties.Setter().withCircuitBreakerRequestVolumeThreshold(50);
  }
  /*
   * This method is a constructor and sets http client based on provides args.
   * This version uses the default threshold of 50% failures if one isn't provided.
   */
  public CircuitBreaker (HttpClient client,String key, HttpRequestBase req){
      this(client, key, req, 50);
  }
  /*
  * This method runs the command and returns the response.
  */
@Override
protected HttpResponse run() throws Exception {
    HttpResponse resp = null;
    resp = client.execute(req);
    if (resp != null)
        logger.info("Request to " + req.getURI() + " succeeded!");
    return resp;
}
/*
 * Fallback method in in the event the circuit breaker is tripped.
 * Overriding the default fallback implemented by Hystrix that just throws an exception.
 * @see com.netflix.hystrix.HystrixCommand#getFallback()
 */
@Override
protected HttpResponse getFallback() {
    //For later expansion as needed.
    logger.error("Circuit Breaker has " + getExecutionEvents() + ". Reason: "+ getFailedExecutionException().getMessage());
    return null;
}
}

您可以嘗試增加 CircuitBreaker 的超時時間,看看會發生什么:

HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(5000)

因為根據Hystrix Wiki ,HystrixCommand 的默認超時時間是 1 秒,而您的 HttpGet 返回內容可能需要 1 秒以上。

您不需要增加超時時間來向 google 發出簡單的 get 請求。 試試這個。

public class HttpCommand extends HystrixCommand<HttpResponse> {

  private final HttpClient client;
  private final HttpRequestBase req;

  public HttpCommand(HttpClient client, HttpRequestBase req) {
    super(HystrixCommandGroupKey.Factory.asKey("HttpCommandGroup"));
    this.client = client;
    this.req = req;
  }

  @Override
  protected HttpResponse run() throws Exception {
    return client.execute(req);
  }

}

和一個簡單的測試

@Test
  public void executeCommandTest(){
    HttpClient client = HttpClientBuilder.create().build();
    HttpGet httpget = new HttpGet("http://www.google.com");
    HttpResponse resp = new HttpCommand(client, httpget).execute();
    assertEquals(HttpStatus.SC_OK, resp.getStatusLine().getStatusCode());
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM