본문 바로가기

디자인 패턴/Circuit breaker 패턴

Circuit Breaker 패턴 - 2) 넷플릭스의 Hystrix 라이브러리 사용하기

1) 시나리오

 

 

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