본문 바로가기

엔지니어링(TA, AA, SA)/아키텍처

[아키텍처] 터빈 서버 / 히스트릭스 대시보드 서버

터빈 서버(Turbine server)는 마이크로서비스에 설치된 히스트릭스 클라이언트 스트림을 통합해 주는 기능을 제공합니다. 히스트릭스 클라이언트 스트림은 마이크로서비스에 설치된 히스트릭스 클라이언트에서 마이크로서비스로의 서비스 처리 요청에 대한 결과값을 스트림으로 전달해주는 역할을 하고, 마이크로서비스에 히스트릭스 스트림 메시지는 이후에 설명할 히스트릭스 커맨드 설정을 통해서 적용할 수 있습니다. 터빈 서버는 각 마이크로서비스에서 생성되는 히스트릭스 클라이언트의 스트림 메시지를 터빈 서버로 모두 수집하는 역할을 합니다.


터빈 서버의 'application.yml' 파일의 'appconfig' 속성에 세 개의 마이크로서비스 애플리케이션 이름을 등록하면 등록된 세 개의 애플리케이션에서 발생하는 히스트릭스 클라이언트 스트림 정보를 수집할 수 있습니다. 이렇게 수집된 스트림정보는 터빈 스트림으로 제공합니다.


'http://localhost:9999/turbine.stream'을 조회하면 각각의 마이크로서비스에서 생성되는 스트림 정보를 한꺼번에 확인할 수 있습니다. 이렇게 수집된 스트림 정보는 히스트릭스 대시보드 웹페이지를 통해서 확인할 수 있습니다. 


터빈 서버 'application.yml' 설정과 애플리케이션에서 '@EnableTurbine' 어노테이션을 등록하는 것만으로 간단하게 터빈 서버를 동작 시킬 수 있습니다.

@SpringBootApplication
@EnableEurekaClinet
@EnableTurbin
public class MsaTurbineApplication {
	
	public static void main(String[] args) {
		SpringApplication.run(MsaTurbineApplication.class, args);
	}
}


터빈 서버에서 각 마이크로서비스에서 보내는 히스트릭스 스트림 메시지를 수집합니다. 따라서 각 마이크로서비스에 스트림 메시지를 보내기 위한 히스트릭스 설정을 해줘야 합니다.

import org.springframework.boot.SpringApplication;

@EnableFeignClients
@EnableCircuitBreaker
@EnableEurekaClient
@SpringBootApplication
public class MicroServiceApplication {
	pulbic static void main(String[] args) {
		SpringApplication.run(MicroServiceApplication.class, args);
	}
}


@HystrixCommand
@RequestMapping(value="/coffeeOrder", method=RequestMethos.POST)
public ResponseEntity<CoffeOrderCVO> coffeeOrder(@RequestBody CoffeeOrderCVO coffeeOrderCVO) {
	
	// is member
	if(isMsaServiceCoffeeMemeber.coffeeMember(coffeeOrderCVO.getCustomerName())) {
		System.out.println(coffeeOrderCVO.getCustomerName() + "is a member!");
	}

	// coffee order
	coffeeOrderServiceImpl.coffeeOrder(coffeeOrderCVO);

	// kafka
	kafkaProducer.send("kafka-test", coffeeOrderCVO);

	return new ResponseEntity<CoffeeOrderCVO>(coffeeOrderCVO, HttpStatus.OK);
}


각 마이크로서비스의 'application' 메인 클래스에 '@EnableCircuitBreaker' 어노테이션을 추가하고, 스트림 메시지를 보낼 REST API 함수에 '@HystrixCommand' 어노테이션을 추가합니다. '@HystrixCommand' 어노테이션이 붙은 REST API가 호출되면 해당 REST API 함수와 관련된 스트림 메시지를 터빈 서버가 수집해서 히스트릭스 대시보드에 전달하여 모니터링됩니다. '커피 주문', '회원 확인', '주문 처리 상태 확인' 마이크로 서비스에 어노테이션 설정을 추가하여 모니터링이 가능하도록 설정합니다.



히스트릭스 대시보드 서버


히스트릭스 대시보드는 히스트릭스 클라이언트에서 생성하는 스트림을 시각화하여 웹화면에 보여주는 대시보드 화면입니다. 히스트릭스 클라이언트가 설치된 마이크로서비스는 마이크로서비스 호출 시 생성되는 스트림 메시지를 터빈 서버에 전송합니다. 마이크로서비스에 히스트릭스 클라이언트가 설치되면 'http://마이크로서비스IP:포트/hystrix.stream'으로 스트림 메시지를 보내고, 히스트릭스 대시보드에 등록하여 실시간으로 확인할 수 있습니다 마이크로서비스의 개수가 많아지면 마이크로서비스 하나하나 상태를 확인하기 힘들기 때문에 터빈 서버를 이용하여 개별 히스트릭스 스트림을 한꺼번에 수집하는 기능으로 사용합니다. 히스트릭스 대시보드는 터빈 서버에 연결하여 일괄 취합된 스트림 메시지를 웹 화면을 통해 확인할 수 있습니다.



히스트릭스 서킷 브레이커


히스트릭스 서킷 브레이커(Hystrix circuit breaker)는 API 함수가 비정상적으로 동작할 때 대체할 함수를 지정함으로써 장애를 회피할 수 있는 기능입니다.


@HystrixCommand(fallbackMethod = "fallbackFunction")
@RequestMapping(value = "/fallbackTest", method=RequestMethod.GET)
public String fallbackTest() throws Throwable {
	throw new Throwable("fallbackTest");
}
public String fllbackFunction() {
	return "fallbackFunction()";
}

서킷 브레이커 기능을 위해서 대상이 되는 REST API에 '@Hystrix Command'에 'fallbackMethod'를 정의합니다. 해당 REST API 함수에 'Exception'이 발생하면 서킷 브레이커 설정에 따라서 'fallbackMethod'에 정의된 함수가 기능을 대체하게 됩니다. 또한, 히스트릭스 대시보드에서 서킷 브레이커로 처리된 API와 정상적으로 처리된 API의 상태를 구분하여 확인할 수 있습니다.