오늘 백기선님()의 유투브 생방()에 뒤늦게 참여하다가 SpringBootApplication admin에 대한 기능을 살펴봤습니다. 스프링부트에서는 JMX(Java Management eXtension) 에서 접근할 수 있는 속성들을 많이 제공합니다. 개인적으로는 JMX 기능을 통해서 애플리케이션이나 서버를 관리하던 경험이 전무한 탓에 이에 대해서는 가볍게 무시하고 넘어갔지만, 백기선님은 NHN에서 근무할 때 꽤 유용했다고 하시니 다시한번 살펴보기로 했습니다.
이상민님의 책 ‘자바 성능을 결정짓는 코딩 습관과 튜닝 이야기’(http://www.yes24.com/24/Goods/2842880?Acode=10) 에서 모니터링 API로써 JMX에 대해 다루고 있다(한번 읽어봐야겠다).
스프링 부트 애플리케이션에서는 관리 기능과 관련한 속성(spring.application.admin.enabled
)을 활성화할 수 있다. 이 기능을 활성화하면 실행되고 있는 운영체제의 MBeanServer
에 SpringApplicationAdminMXBean
가 노출된다.
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
32
33
34
35
36
37
38
39
40
/**
* An MBean contract to control and monitor a running {@code SpringApplication} via JMX.
* Intended for internal use only.
*
* @author Stephane Nicoll
* @since 1.3.0
*/
public interface SpringApplicationAdminMXBean {
/**
* Specify if the application has fully started and is now ready.
* @return {@code true} if the application is ready
* @see org.springframework.boot.context.event.ApplicationReadyEvent
*/
boolean isReady();
/**
* Specify if the application runs in an embedded web container. Return {@code false}
* on a web application that hasn't fully started yet, so it is preferable to wait for
* the application to be {@link #isReady() ready}.
* @return {@code true} if the application runs in an embedded web container
* @see #isReady()
*/
boolean isEmbeddedWebApplication();
/**
* Return the value of the specified key from the application
* {@link org.springframework.core.env.Environment Environment}.
* @param key the property key
* @return the property value or {@code null} if it does not exist
*/
String getProperty(String key);
/**
* Shutdown the application.
* @see org.springframework.context.ConfigurableApplicationContext#close()
*/
void shutdown();
}
jmx 에 노출되는 이름은
spring.application.admin.jmx-name
속성을 통해 재정의할 수 있다.
이렇게 SpringApplicationAdminMXBean
가 노출되면 원격에서 스프링 부트 애플리케이션을 관리할 수 있게 된다. 예전에는 스프링 부트 액츄에이터(Actuator)에서 Remote Shell기능을 지원했지만, 스프링 부트 2.0 에서는 제외(Deprecated)되었다.
이 기능을 사용하고 싶다면
org.crsh:crsh.shell.telnet
의존성을 추가하면 된다. 굳이 터미널로 접근해서 애플리케이션을 관리해야할 필요성은 많이 사라져간다.
실행중인 자바 애플리케이션의 정보를 MBeanServer 에 등록하는 MBean 클라이언트 기능을 spring.application.admin.enabled
속성으로 활성화할 수 있다. 이 속성이 활성화되면 JConsole 등 MBean 사양을 따르는 감시 및 관리도구에서 접근하여 애플리케이션 정보를 살펴보고 종료하는 등의 원격제어가 가능해진다.
추가적으로, 스프링 부트 액츄에이터(Actuator)도 MBean 으로 노출된다. 이에 대해서는 추후에 살펴보겠다.
에이전트측에서 MBean 를 조작하기 위한 인터페이스입니다