1) 시나리오
- A서버에서 B서버에 http call
- A서버 -> circuit breaker -> B서버
- 전체 소스 : https://github.com/qwer9412/circuit_breaker_test
2) pom.xml에 dependency 추가
<dependency>
<groupId>com.netflix.hystrix</groupId>
<artifactId>hystrix-core</artifactId>
<version>1.5.18</version>
</dependency>
<dependency>
<groupId>io.reactivex.rxjava2</groupId>
<artifactId>rxjava</artifactId>
</dependency>
3) circuit breaker (GetACircuitBreaker) 코드
public class GetACircuitBreaker extends HystrixCommand<ADto>{
protected GetACircuitBreaker(HystrixCommandGroupKey group) {
super(group);
}
@Override
//B 서버에 http call
public ADto run() throws Exception {
RestTemplate restTemplate = new RestTemplate();
ADto value_a = (ADto)restTemplate.exchange("http://localhost:8081/B", HttpMethod.GET,null, new ParameterizedTypeReference<ADto>(){}).getBody();
return value_a;
}
@Override
//fall-back 메시징
public ADto getFallback() {
return new ADto("x","x");
}
}
- HystrixCommand <> 안에는 response객체 넣기(ADto)
- run메서드에서 B서버에 http call
- getFallback 메서드는 B서버에서 응답 실패 시 실행
4) A controller
@RestController
public class AController {
@GetMapping("/A")
public ADto getA() {
HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("group A");
ADto value_a = new GetACircuitBreaker(groupKey).execute();
return value_a;
}
}
- 3에서 만든 GetACircuitBreaker클래스의 execute 메서드로 실행
5) B controller
@RestController
public class BController {
@GetMapping("/B")
public BDto getB() {
return new BDto("o","o",Arrays.asList("hello","world"));
}
}
6) 결과
- http 통신 성공하면 {s1="o", s2="o", list={hello, world}}
- http 통신 실패시 {s1="x, s2="x", list={}}
관련 글
Circuit breaker 패턴 - 1) Circuit breaker 이해하기
Circuit Breaker 패턴 - 3) spring을 이용한 Circuit breaker
'디자인 패턴 > Circuit breaker 패턴' 카테고리의 다른 글
Circuit breaker 패턴 - 3) spring을 이용한 Circuit breaker (0) | 2020.05.01 |
---|---|
Circuit breaker 패턴 - 1) Circuit breaker란 (0) | 2020.04.08 |