Spring cloud Circuit Breaker Config빈 등록 방법은 아래 포스팅을 참고
https://tweety1121.tistory.com/entry/Spring-circuitbreaker-actuator-health-check-%EC%84%A4%EC%A0%95
application.yml
resilience4j.circuitbreaker:
configs:
default:
failureRateThreshold: 50
slowCallRateThreshold: 100
slowCallDurationThreshold: 60000
permittedNumberOfCallsInHalfOpenState: 4
maxWaitDurationInHalfOpenState: 1000
slidingWindowType: COUNT_BASED
slidingWindowSize: 10
minimumNumberOfCalls: 10
waitDurationInOpenState: 10000
registerHealthIndicator: true
failureRateThreadhold : 실패 비율 50%가 넘어가면 서킷브레이커가 오픈된다.
minimumNumberOfCalls : 실패율, 느린 응답 비율을 계산한 최소 요청 수 (10개 이상부터 서킷브레이커 오픈에 대한 계산을 한다)
permittedNumberOfCallsInHalfOpenState : 서킷이 반오픈상태일 때 받아들일 요청 갯수
maxWaitDurationInHalfOpenState : 회로가 반-개방 상태일 때, 처리하는 요청의 최대 타임아웃
https://resilience4j.readme.io/docs/circuitbreaker
TestController.java
@RestController
@RequiredArgsConstructor
public class TestController {
//@RequiredArgsConstructor는 final이 붙은 초기화되지 않은 필드 생성자를 만들어준다
// @NotNull 도 가능
// 의존성을 높이기 위해
private final TestService testService;
@GetMapping("/test")
public String test() {
int randomNo = new Random().nextInt();
String result = randomNo % 2 == 0? testService.test(): testService.fail();
return result;
}
}
/test API를 호출할 때 랜덤하게 성공과 실패를 호출한다.
짝수일경우 test호출 홀수일 경우 fail 호출
TestService.java
@Service
public class TestService {
@CircuitBreaker(name = "test", fallbackMethod = "fallbackGet")
public String test() {
return "hi";
}
@CircuitBreaker(name="test", fallbackMethod = "fallbackGet")
public String fail() {
throw new RuntimeException("Failed");
}
private String fallbackGet(Throwable t) {
return "FallBack error Message : " + t.getMessage();
}
}
@CircuitBreaker 어노테이션을 사용하려면 spring-starter-aop를 gradle에 추가해줘야한다.
implementation 'org.springframework.boot:spring-boot-starter-aop'
RuntimeException 이 발생하면 fallbackMethod를 호출한다.
@CicuitBreaker에 name을 지정하면 동일한 서킷브레이커로 같은 config설정이 적용된다.
랜덤하게 정상적인 호출과 exception이 발생한다.
최초 /actuator/health 호출시
test circuit breaker에 status가 CLOSED로 되어있다.(details가 citcuit의 상태)
10개호출 했을 때 50%이상 실패했을 경우 서킷이 오픈되도록 설정되어있다.
/test 를 호출하면
hi
FallBack error Message : Failed
두 가지 리턴이 랜덤하게 호출된다.
실패할때마다 failedCalls 수가 증가한다.
FallBack error Message : CircuitBreaker 'test' is OPEN and does not permit further calls
10개중 50%이상이 실패일 경우 Circuit이 오픈된 걸 확인할 수 있다.
'Spring' 카테고리의 다른 글
Spring restTemplate Connection pool 사용 (0) | 2022.02.07 |
---|---|
Spring cloud circuit breaker fallbackUri 사용 (0) | 2022.02.04 |
Spring circuitbreaker actuator health check 설정 (0) | 2022.02.04 |
Spring Cloud Gateway Global Error Handler (0) | 2022.02.03 |
Spring @Valid 어노테이션으로 파라미터 검증하기 (0) | 2022.02.02 |