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가 난다. 없으면 만들어주자.!
'dev > Java&Spring' 카테고리의 다른 글
Java Authentication and Authorization Service (JAAS) - 요약 (0) | 2019.08.18 |
---|---|
Spring Cloud Gateway 2.1.0RELEASE 레퍼런스 (2) | 2019.05.12 |
Spring에서 Client Authentication (two-way TLS/SSL) 구현하기 (1) | 2019.04.07 |
Spring에서 insecure SSL 요청(RestTemplate, WebClient) (1) | 2019.04.06 |
스프링마이크로서비스 2/e 책 리뷰 (0) | 2019.02.23 |