Resilience4J断路器启动HTTP错误代码

时间:2020-03-26 07:22:56

标签: java circuit-breaker resilience4j

我知道我们可以在构建recordExceptions()时使用CircuitBreakerConfig来注册断路器应转换为OPEN状态的异常。

同样,在特定的HTTP代码的情况下,有没有办法使Circuit Breaker启动?就像在代码503(服务不可用)上一样

2 个答案:

答案 0 :(得分:2)

自述文件(https://resilience4j.readme.io/docs/circuitbreaker#section-create-and-configure-a-circuitbreaker

// Create a custom configuration for a CircuitBreaker
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
  .recordExceptions(IOException.class, TimeoutException.class) // add you exceptions here!!!
  .ignoreExceptions(BusinessException.class, OtherBusinessException.class)
  .build();

记录为失败并因此增加的异常列表 失败率。任何与以下其中一项匹配或继承的异常 列表被视为失败,除非通过显式忽略 ignoreExceptions。

答案 1 :(得分:1)

您需要为客户端的外部调用编写一个Exception / Response处理程序,并根据收到的http状态抛出自定义异常。然后将这些异常注册为断路器配置中的记录异常。以下是一个小例子。 CB仅在AbcException上打开。 CB配置为resilience4j.circuitbreaker.instances.bookService.record-exceptions=com.sk.example.cb.circuitbreakerr4j.AbcException

@Service
@Slf4j
public class BookApiService {
  RestTemplate restTemplate = new RestTemplate();
  @CircuitBreaker(name = "bookService", fallbackMethod = "getBookFallback")
  public String getBook(){
    try {
      ResponseEntity<String> stringResponseEntity = restTemplate.getForEntity(new URI("http://localhost:8080/book"), String.class);
      if(null != stringResponseEntity){
        if(stringResponseEntity.getStatusCode().is2xxSuccessful()){
          return stringResponseEntity.getBody();
        }
      }
    } catch (URISyntaxException e) {
      e.printStackTrace();
    }catch (HttpServerErrorException e){
      log.error("Service unavailable",e);
      if(e.getMessage().startsWith("503")) {
        throw new AbcException();
      }else{
        throw e;
      }
    }
    return "";
  }