我知道我们可以在构建recordExceptions()
时使用CircuitBreakerConfig
来注册断路器应转换为OPEN
状态的异常。
同样,在特定的HTTP代码的情况下,有没有办法使Circuit Breaker启动?就像在代码503(服务不可用)上一样
答案 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 "";
}