인생사는 이야기
[MSA] Circuit Breaker 본문
Circuit Breaker 적용을 위한 Project 구조
Item Service Project
https://github.com/bwcho75/msa_pattern_sample/tree/master/item-spring-hystrix
User Service Project
1. Maven Dependency 추가
Spring Starter Project 생성 후 Circuit Breaker 적용을 위해 maven dependency를 추가해 주어야 한다.
spring-cloud-starter-hystrix 는 Hystrix circuit breaker를 이용한 의존성이고 hystrix-dashboard와 actuator 는 hystix dash 보드를 띄우기 위한 의존성이다.
프로젝트 내의 pom.xml을 열어 아래의 dependency를 추가한다.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
<version>1.4.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.11.RELEASE</version>
</dependency>
2. 설정 정보 세팅
Service name과 Config Server, Eureka Server URL을 세팅한다.
bootstrap.properties
spring.application.name=user-service
spring.cloud.config.uri= {config server url}
eureka.client.serviceUrl.defaultZone={eureka dashboard url}3. Circuit Breaker Annotation 선언
UserApplication.class
Circuit breaker를 이용하기 위해서는 메인 함수 선언 상단에 Annotation으로 선언을 해준다.
@SpringBootApplication
@EnableCircuitBreaker
@EnableHystrixDashboard
@EnableEurekaClient
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
}
}
위의 코드와 같이 @EnableCircuitBreaker Annotation을 추가해주면 Circuit breaker를 사용할 수 있고, 그리고 추가적으로 Hystrix 대쉬 보드를 사용할것이기 때문에, @EnableHystrixDashboard
Annotation을 추가한다.
4. Controller 구현
클라이언트 요청을 받아 처리하는 Controller를 구현한다.
@RestController Annotation을 해당 클래스에 적용하고
@RequestMapping Annotation을 이용해서 클라이언트의 요청을 처리할 메서드를 지정한다.
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
GetItemCommand getItemCommand;
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
@RequestMapping(value="/{name}",method=RequestMethod.GET)
public List<User> getUsers(@PathVariable String name){
logger.info("User service "+name);
List<User> usersList = getItemCommand.getItem(name);
return usersList;
}
}5. Item Service 호출
UserSerivce에서 ItemService를 호출하는 부분을 구현하는 소스이다. Hystrix와 마찬가지로 Spring Hystrix에서도 타 서비스 호출은 Command로 구현한다. 아래는 Item Service에서 Item 목록을 가지고 오는 GetItemCommand 코드이다.
GetItemCommand.class
Hystrix Command와 거의 유사하지만 Command를 상속 받아서 사용하지 않고, Circuit breaker를 적용한 메서드에 간단하게 @HystrixCommand Annotation만을 추가하면 된다.
아래 코드를 자세하게 보자. 주의할점은 Item Service 호출을 RestTemplate API를 통해서하는데, RestTemplate 객체인 resetTemplate는 @Autowrire로 생성한다.
// GetItem command
@HystrixCommand(fallbackMethod = "getFallback",
commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "500")
},
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "30"),
@HystrixProperty(name = "maxQueueSize", value = "101"),
@HystrixProperty(name = "keepAliveTimeMinutes", value = "2"),
@HystrixProperty(name = "queueSizeRejectionThreshold", value = "15”)
}
)
public List<User> getItem(String name) {
List<User> usersList = new ArrayList<User>();
List<Item> itemList = (List<Item>)restTemplate.exchange("http://10.80.8.46:8082/users/"+name+"/items"
,HttpMethod.GET, null ,new ParameterizedTypeReference<List<Item>>() {}).getBody();
usersList.add(new User(name,"myemail@mygoogle.com",itemList));
return usersList;
}
// fall back method
// it returns default result
@SuppressWarnings("unused")
public List<User> getFallback(String name){
List<User> usersList = new ArrayList<User>();
usersList.add(new User(name,"myemail@mygoogle.com"));
return usersList;
}Item Service를 호출하는 코드는 getItem(String name) 메서드이다. 여기에 Circuit breaker를 적용하기 때문에, 메서드 앞에 @HystrixCommand(fallbackMethod = "getFallback") Annotation을 정의하였다. 그리고 Item Service 장애시 호출한 fallback 메서드는 getFallback 메서드로 지정하였다.
getItem안에서는 ItemService를 RestTemplate을 이용하여 호출하고 그 결과를 List<User> 타입으로 반환한다.
앞서 정의한 Fallback은 getFallback() 메서드로 Circuit breaker를 적용한 원래 함수와 입력 (String name)과 출력 (List<User>) 인자가 동일하다.
ü HystrixProperty Options
Option |
Description |
execution.isolation.thread.timeoutInMilliseconds |
명령 수행 제한 시간을 밀리 초 단위로 설정 |
coreSize |
코어 스레드 풀 크기를 설정 |
maxQueueSize |
BlockingQueue 구현의 최대 대기열 크기를 설정 |
keepAliveTimeMinutes |
연결 유지 시간 (분)을 설정 |
queueSizeRejectionThreshold |
|
'IT > JAVA' 카테고리의 다른 글
[MSA]Zuul Server (0) | 2018.07.26 |
---|---|
[MSA]EUREKA Server (0) | 2018.07.26 |
[MSA] Spring Cloud Config Server (0) | 2018.07.26 |
JSON (제이슨, JavaScript Object Notation) (1) | 2013.11.20 |
[JAVA] 1. 자바 설치 및 윈도우 환경변수 설정하기 (1) | 2012.04.16 |