티스토리 뷰

Hystrix가 무엇인가? 에 대한 내용은 지난 시간에 다루었다. 열심히 이 method, 저 method에 @HystirxCommand를 달아 놓고 이게 잘 동작하고 있는지 직접 확인을 하는건 작은 프로젝트에서는 가능할지 몰라도 서비스의 개수가 늘어나면 늘어날수록 어려움에 처하게 된다. 이럴때 유용하게 사용하라고 Hystrix에서는 모니터링을 할 수 있는 Dashboard를 제공을 한다.

 

Hystrix Dashboard는 single instance에 대해 @HystirxCommand가 정의된 method에 대한 모니터링을 수행할수도 있게 해주고 Turbine을 이용해 multi instance에 대해 @HystirxCommand가 정의된 method에 대한 모니터링을 수행할수도 있게도 해준다. 즉 실제 환경과 같은 환경에서 Hystrix 모니터링을 수행하려면 Turbine 서버를 이용해서 모니터링 하는것이 더 적절하다고 판단하여 Turbine을 사용하는 예제를 통해 알아보도록 하겠다. Turbine은 Hystrix Client Stream 을 통합해 주는 역할을 하는 서버라고 생각하면 된다.

 

Turbine을 이용해 Hystrix Dashboard를 구성하려면 동작하고 있는 API 서버 외에 2개의 어플리케이션을 추가해야한다. 하나는 Hystrix Dashboard 어플리케이션, 다른 하나는 Turbine 서버가 동작할 어플리케이션이다. 순서대로 설치해보자.


Hystrix Dashboard 구성

전에 Eureka, Zuul 을 설치했던 것과 마찬가지로 spring initializr 에 들어가서 Hystrix Dashboard 프로젝트를 만들어본다. 물론 이클립스에서 Spring Starter Project 를 생성해서 만들어도 무관하다. 

Maven 프로젝트로 만들고 dependency는 Hystrix Dashboard를 추가시켜준다.

다 하고 나서는 하단의 Generate 를 눌러서 다운로드를 받는다. 

그 다음 다운받은 Maven 프로젝트를 import 하는것은 지난 글을 참조한다. 

 

import를 다 하면 위와 같은 구조의 프로젝트가 생성된다. springboot 프로젝트이기에 전과 같은 동일한 구조로 생성이 되었다. 구성은 간단하다. HystirxDashboardApplication.java 파일과 application.properties 정도 보면 된다. 

HystirxDashboardApplication.java

package com.oingdaddy.tistory.HystrixDashboard;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;

@EnableHystrixDashboard
@SpringBootApplication
public class HystrixDashboardApplication {

    public static void main(String[] args) {
        SpringApplication.run(HystrixDashboardApplication.class, args);
    }
}

여기에서는 @EnableHystrixDashboard 를 추가시켜주면 된다. 

 

 

application.properties 

server.port=8300
spring.application.name=HystrixDashboardServer
hystrix.dashboard.proxy-stream-allow-list=localhost

application.properties에서는 포트번호정도 지정해주면 된다. 그리고 localhost를 proxy-stream-allow-list에 추가를 해준다. 

 

그런다음 기동! 벌써 끝났다. 다른것도 그랬지만 이것도 깜짝 놀랄만큼 간단하게 금방 설치가 된다. 

 

hystrix dashboard 첫화면

기동 후 http://localhost:8300/hystrix 로 접속을 해보면 고슴도치 같이 생긴 캐릭터가 나오는 Hystrix Dashboard 화면을 만나볼 수 있다. 


Hystrix Dashboard를 이용해 Single Instance 모니터링 해보기 

일단 여러 instance를 모니터링 하는 Turbine을 설치하기 앞서 하나의 어플리케이션에 대해 모니터링을 수행해보도록 하겠다. 하나의 어플리케이션은 기존에 Hystrix가 동작하도록 구성해 놓은 EurekaClient1 이라는 어플리케이션을 활용하겠다. 이 어플리케이션에는 어떤 설정이 필요한지 살펴보자. 

 

모니터링할 어플리케이션 application.yml

management:
  endpoints:
    web:
      exposure:
        include: "*"

application.yml (properties) 에는 위와 같이 모든 endpoint 를 열어두는 설정이 필요하다. 그래야지 모니터링에 필요한 항목들을 어플리케이션으로부터 뽑아낼수 있을테니.. 또한 당연히 이 설정을 사용하기 위해서 Actuator 의존성 주입이 필요하다.

 

모니터링할 어플리케이션 pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

 

이렇게 다 설정했다면 모니터링할 어플리케이션을 재기동해서 설정을 반영하고 다시 대시보드 화면으로 가보자. 

 

hystrix dashboard

http://localhost:8081/actuator/hystrix.stream

자신이 모니터링할 어플리케이션의 주소를 입력하고 그 뒤에 /actuator/hystrix.stream을 입력하고 title에 app1을 입력하고 Monitor Stream 을 누른다. 

 

잠깐의 로딩 화면이 나오고 위와 같이 나온다면 성공이다. 필자의 EurekaClient1 이라는 앱에는 하나의 메소드에만 @HystirxCommand가 정의되어 있어서 모니터링 대상 항목도 하나이다. printHelloWorld() 라는 메소드를 마구마구 실행시켜보자. 마구마구 실행시킬때 좋은 녀석이 바로 전에 다룬 Apache JMeter이다. 이걸 활용해서 printHelloWorld()에 요청을 날려보자. 

 

요청이 많아지면서 작은 동그라미가 점차 커져가며 위와 같은 모습으로 변한다. 실시간으로 커지고 작아지고 한다. 현재는 요청을 1초 안으로 수행되면 Circuit Breaker가 동작하지 않게끔 해놔서 모든 요청이 1초 안에 처리되는 간단한 일이라 Circuit Closed 상태이다. (회로 차단기가 닫힌 상태, 즉 동작하는 상태라는 것이다.) JMeter를 끄고 잠시 시간이 지나면 원은 다시 작아진다. 그래프도 생긴다. 그래프는 2분간의 상태 변화를 나타낸다. 

 

색상별로 숫자들이 올라가기도 내려가기도 하는데 글자의 색상의 의미는 우측 상단에 표시되어 있다. 

 

그럼 timeout을 0.001초로 변경을 하고 테스트를 한번 해보겠다. 무조건 timeout에 걸리게 하겠다는 심산이다.

시작하자마자 빨간색 원이 커지며 바로 Circuit Open이 되어버린다. 바로 차단이 되어버리고 요청은 보낼수 없는 상태가 되어버린다. 회로가 차단되어버린것이다. 

요청을 보낼수 없으므로 곧 빨간색 원도 작아지며 2분간 상태변화를 나타내는 그래프도 아무런 작업을 처리하지 않고 있음을 나타내고 있다. 이런 식으로 Dashboard는 회로가 잘 차단이 되는지 확인을 할 수 있는 역할을 한다. 


Turbine Server 구성

사실 위에 나온 내용들만 사용한다 하더라도 아무런 문제는 없다. 조금 더 손이 많이 갈 뿐이지. 조금 더 손이 많이 가느냐 통합모니터링을 위한 서버(Turbine)을 구성을 하느냐 차이다. 따라서 이 Turbine 서버를 구성하는것은 꼭 필요한 사람만 보는것을 추천한다. 

 

위에 Hystrix Dashboard를 설치했던 것과 마찬가지로 spring initializr 에 들어가서 Turbine 프로젝트를 만들어본다. 물론 이클립스에서 Spring Starter Project 를 생성해서 만들어도 무관하다. 

Maven 프로젝트로 만들고 dependency는 Turbine, Eureka Discovery Client를 추가시켜준다.

다 하고 나서는 하단의 Generate 를 눌러서 다운로드를 받는다. 그리고 import를 해준다. 

 

import를 다 하면 위와 같은 구조의 프로젝트가 생성된다. springboot 프로젝트이기에 전과 같은 동일한 구조로 생성이 되었다. 구성은 간단하다. TurbineApplication.java 파일과 application.properties 정도 보면 된다. 

 

TurbineApplication.java

package com.oingdaddy.tistory.Turbine;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.turbine.EnableTurbine;

@EnableEurekaClient
@EnableTurbine
@SpringBootApplication
public class TurbineApplication {

    public static void main(String[] args) {
        SpringApplication.run(TurbineApplication.class, args);
    }
}

전에 봤던 @EnableEurekaClient 와 새로운 @EnableTurbine을 추가시켜준다. 

 

 

application.properties

server.port=8400
spring.application.name=turbine
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka/
turbine.cluster-name-expression=new String('default')
turbine.app-config=oingdaddy,oingdaddy2

이렇게 설정을 해주면 된다. 중요한 부분은 turbine.app-config 부분인데 통합 모니터링을 할 어플리케이션들의 spring.application.name에 대한 정보를 넣어주면 된다. 

 

이렇게 하면 Turbine 서버에 대한 설정은 모두 끝이 났고 통합모니터링 대상이 될 각각의 어플리케이션들의 설정을 해줘야 한다. 위에서 나온 내용들이기에 간단히 언급을 한번 더하자면 

 

  • hystrix, actuator 의존성 추가
  • Application.java (springboot main) 클래스에 @EnableCircuitBreaker 추가
  • application.properties에 management.endpoints.web.exposure.include=* 추가
  • @HystirxCommand 메소드에 추가해보기

이렇게 설정을 마쳤으면 모든 서버를 기동해준다. 그리고 아까 설치해 놓은 Hystrix Dashboard로 들어간다. 

 

이번엔 URL을 아까 모니터링할 앱을 직접 지정한것이 아닌 Turbine 서버의 정보를 넣어준다. 

http://localhost:8400/turbine.stream 

 

이런식으로 App1의 printHelloWorld, App2의 printHelloWorld2 가 각각 모니터링 되는 모습을 확인 할 수 있다. 또한 클래스명은 둘다 SampleController로 동일한데 이는 클러스터링 되어 모니터링 되는것을 확인할 수 있다. App2의 SampleController를 SampleController2 로 변경을 한다면 결과는 다음과 같이 나타난다. 

 

이렇게 멀티 instance에 대해 Turbine을 적용하는 것까지 알아보았다. 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31