인생사는 이야기

[MSA] Circuit Breaker 본문

IT/JAVA

[MSA] Circuit Breaker

채율파파 2018. 7. 31. 16:25
반응형

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

 maxQueueSize 도달하지 않았 더라도 거부가 발생하는 인위적인 최대 대기열 크기


반응형

'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
Comments