dev/Java&Spring

netflix hystrix-dashboard 가 뜨지 않을 때

lugi 2019. 5. 8. 04:12

Spring Cloud 기반으로 MSA를 구현하기 위해 요 며칠 고군분투 중이다.

전체적인 정리는 나중에 해야겠지만, 방금 한 번 삽질을 한 김에 정리를 짧게 남겨보려 한다.

 

일단 배경을 살펴 보자면

 

hystrix 라고 하는 Netflix OSS에 포함되어 있으며, Spring Cloud 에도 포함된 지연 내성 및 장애 내성을 갖게 해 주는 라이브러리이다. 이에 대해서는 나중에 자세히 다룰지도 모른다.

 

hystrix 에 관한 부분은 아니고, hystrix 의 상태를 모니터링 및 시각화 해 주는 hystrix-dashboard 에 관해 다룰 것인데

 

일단 아래와 같이

# pom.xml 안에 포함된 의존성

# 상략...

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
        
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

# 후략...

 

의존성이 포함되어 있고, 메인클래스에 @EnableHystrixDashboard 어노테이션을 붙였다면, 원래대로라면 /actuator/hystrix.stream endpoint 에서는 이벤트스트림이 모니터링 되어야 하고 /hystrix 를 웹브라우저로 접속하면 dashboard가 떠서 서비스간의 통신 상태에 대해서

 

 

출처 : https://cloud.spring.io/spring-cloud-netflix/multi/multi__circuit_breaker_hystrix_dashboard.html

 

위와 같은 대시보드가 떠야한다.

 

그런데 /actuator/hystrix.stream 에서 이벤트 모니터는 정상적으로 되는데 아무리해도 /hystrix 의 대시보드는 404가 뜬다. 몇 번해보다 포기하고 대체 왜 그럴까 살펴보니

 

# EnableHystrixDashboard.class

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(HystrixDashboardConfiguration.class)
public @interface EnableHystrixDashboard {

}

@EnableHystrixDashboard 는 위와 같이 HystrixDashboardConfiguration.class를 import 하는 것을 발견

 

해당 파일을 찾아서 소스코드를 보니

# HystrixDashboardConfiguration.class

@Bean
public HystrixDashboardController hsytrixDashboardController() {
	return new HystrixDashboardController();
}

과 같이 안에서 자체적으로 컨트롤러 Bean을 생성하고 있고

 

# HystrixDashboardController.class

@RequestMapping("/hystrix")
public String home(Model model, WebRequest request) {
    model.addAttribute("basePath", extractPath(request));
    return "hystrix/index";
}

 

이 안에서 /hystrix 경로에 대해 view를 반환하고 있다. 그러니까 hystrix-dashboard 의존성을 포함한 것만으로 그 안에서 자체적으로 web 요청을 받아들이는 컨트롤러가 생겼다는 것인데. 왜 나는 계속 404가 떴을까?

 

# HystrixDashboardConfiguration.class

public class HystrixDashboardConfiguration {

	private static final String DEFAULT_TEMPLATE_LOADER_PATH = "classpath:/templates/";
    
    // ... 중략
    
    	@Bean
	public FreeMarkerConfigurer freeMarkerConfigurer() {
		FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
		configurer.setTemplateLoaderPaths(DEFAULT_TEMPLATE_LOADER_PATH);
		configurer.setDefaultEncoding(DEFAULT_CHARSET);
		configurer.setPreferFileSystemAccess(false);
		return configurer;
	}
    
    // ... 하략
 }
    
    

view 는 freeMarker로 쓰고 있는 것으로 보이며, 템플릿을 불러오는 경로를 classpath 의 templates 에서 불러오는 것으로 되어 있다. 물론 일반적으로 spring-boot-web-starter 가 의존성으로 포함된 프로젝트를 initializer 로 생성하면 디렉토리 구조에 templates 디렉토리가 자동으로 생긴다.

 

문제는 내가 spring-boot-web-starter 가 의존성에 포함되지 않은 프로젝트를 그냥 만든 후에, 다른 의존성을 일일이 추가하는 식으로 연습을 해 나갔기 때문에, classpath 에 templates 디렉토리가 생성되지 않은 것에 있었다. resoucres 밑에 /templates 디렉토리를 추가하니 문제 해결... 애초에 initializer 에서 만들 때부터 포함을 했으면 안 생겼을 문제였는데 그렇게 안 하다보니 생긴 해프닝이었다. 그래도 해결했으니 다행!

 

# 요약

- hystrix-dashboard 는 classpath:/templates 에서 view를 찾도록 내장된 구조이므로 resources 밑에 /templates 폴더가 없으면 404가 난다. 없으면 만들어주자.!