Автоматический выключатель Resilience4J для включения HTTP-кода ошибки - PullRequest
1 голос
/ 26 марта 2020

Я знаю, что мы можем использовать recordExceptions() при сборке CircuitBreakerConfig для регистрации исключений, при которых автоматический выключатель должен переходить в состояние OPEN.

Аналогичным образом, есть способ сделать автоматический выключатель в случае указания c HTTP-кода? Как, скажем, в коде 503 (услуга недоступна)

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Вам необходимо написать обработчик Exception / Response для внешних вызовов вашего клиента и выдать пользовательские исключения, основанные на полученном статусе http. Затем зарегистрируйте эти исключения как исключения записей в конфигурации вашего автоматического выключателя. Ниже приведен небольшой пример. ЦБ будет открыт только на 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 "";
  }
1 голос
/ 26 марта 2020

из файла readme (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.

...