Feign Client를 이용해 user-service에서 order-service에 있는 getOrders()를 호출하는데 order-service에 있는 메소드임에도 불구하고 user-service에서 에러가 발생한다. 굳이 user-service에서 잘못된게 아니니 오류를 발생 시키고 싶지않다.
위 로직처럼 order-service를 호출하는 과정에 오류발생 시점에서 폴백시키고 정상처리 시키며 대신 order-service에서 값을 가져오지 못한것만 보여주면 된다.
이런식으로.
이 상황을 만족시키기 위해서 Resilience4J를 쓴다.
user-service에
주입
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
Resilience4J 설정
@Configuration
public class Resilience4JConfig {
@Bean
public Customizer<Resilience4JCircuitBreakerFactory> globalCustomConfiguration() {
CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()
.failureRateThreshold(4) // circuitbreak를 열지말지 결정함. 기본값 50
.waitDurationInOpenState(Duration.ofMillis(1000)) // circuitbreak를 open한 상태를 유지하는 지속 기간. 기본 60초
//circuitbreak가 닫힐때 통화 결과를 기록하는데 사용되는 슬라이딩 창의 유형을 구성 카운트기반 또는 시간 기반 이건 카운트 기반으로 설정.
.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
.slidingWindowSize(2) // circuitbreak가 닫힐 때 호출 결과를 기록하는데 사용되는 슬라이딩 창의 크기 구성 기본값 100
.build();
TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
.timeoutDuration(Duration.ofSeconds(4))
.build();
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.timeLimiterConfig(timeLimiterConfig)
.circuitBreakerConfig(circuitBreakerConfig)
.build()
);
}
}
CircuitBreakerFactory 를 주입받아서
CircuitBreaker circuitbreaker = circuitBreakerFactory.create("circuitbreaker"); //circuitbreaker 생성.
List<ResponseOrder> orderList = circuitbreaker.run(() -> orderServiceClient.getOrders(userId),
throwable -> new ArrayList<>()); // circuitbreaker를 실행시켰을때 getOrders가 에러가 발생하면 빈값을 넣는다.
이렇게 실행 해주면 된다. order-service의 런 상태를 끄던 해서 오류를 생성하고 포스트맨에서 테스트를 해보면 user-service에서는 에러를 발생시키지 않고 위에서 보여준것 처럼
orders값이 빈값이 나오고 정상처리 된다.
'Spring Cloud(MSA)' 카테고리의 다른 글
Zipkin (0) | 2022.09.29 |
---|---|
아파치 카프카 (0) | 2022.09.28 |
kafka 테스트할때 명령어 메모 (0) | 2022.09.27 |
Spring Cloud Bus(with RabbitMq) (0) | 2022.09.24 |
Symmetric, Asymmetric (0) | 2022.09.24 |