본문 바로가기

디자인 패턴/Circuit breaker 패턴

Circuit breaker 패턴 - 3) spring을 이용한 Circuit breaker

1) 시나리오

 

 

2) pom.xml에 dependency 추가

<properties>
	<java.version>1.8</java.version>
	<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
</properties>


<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
	</dependency>
</dependencies>


<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-dependencies</artifactId>
			<version>${spring-cloud.version}</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>
  • spring-cloud-starter-hystrix 라이브러리 추가
  • properties에 버전dependencyManagement가 없으면 아래와 같은 오류 발생함
  • java.lang.NoSuchMethodError: org.springframework.boot.builder.SpringApplicationBuilder.([Ljava/lang/Object;)

 

 

3) circuit breaker (GetACircuitBreaker) 코드

@Service
public class GetACircuitBreaker {
	@Autowired
	RestTemplate restTemplate;
	
	@Bean
	public RestTemplate restTemplate() {
		return new RestTemplate();
	}
	
	@GetMapping("/A")
	@HystrixCommand(fallbackMethod = "getFallback")
	public ADto getA() {
		
		ADto value_a = (ADto)restTemplate.exchange("http://localhost:8081/B", HttpMethod.GET,null
				,new ParameterizedTypeReference<ADto>(){}).getBody();
		
		return value_a;
	}

	public ADto getFallback() {
		return new ADto("x","x");
	}
}
  • @HystrixCommand annotation으로 Circuit Breaker 로직 생성
  • getFallback 메서드는 B서버에서 응답 실패 시 실행

 

 

 

4) A controller

@RestController
public class AController {
	
	@Autowired
	GetACircuitBreaker getACircuitBreaker;
	
	@GetMapping("/A")
	public ADto getA() {
		ADto value_a = getACircuitBreaker.getA();
		
		return value_a;
	}
}
  •  

 

 

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 패턴 - 2) 넷플릭스의 Hystrix 라이브러리 사용하기