[SPRING] 스프링 부트 JMX에 원격으로 액세스하는 방법
SPRING스프링 부트 JMX에 원격으로 액세스하는 방법
스프링이 자동으로 JMX 빈을 노출한다는 것을 알고 있습니다. VisualVM을 사용하여 로컬에서 액세스 할 수있었습니다.
그러나 찌르다 보면 JMX beans를 사용하여 원격으로 앱에 연결할 수 있습니까? 기본 포트가 있습니까? 아니면 추가로 아무것도 정의해야합니까?
감사, 레이.
해결법
-
==============================
1.기본적으로 JMX는 자동으로 로컬에서 액세스 할 수 있으므로 jconsole을 로컬에서 실행하면 포트 노출없이 모든 로컬 Java 응용 프로그램을 감지합니다.
기본적으로 JMX는 자동으로 로컬에서 액세스 할 수 있으므로 jconsole을 로컬에서 실행하면 포트 노출없이 모든 로컬 Java 응용 프로그램을 감지합니다.
원격으로 JMX를 통해 앱에 액세스하려면 RMI 레지스트리 포트를 지정해야합니다. 알아 두어야 할 것은 연결시 JMX가 해당 포트에서 초기화 한 다음 무작위로 높은 포트에서 데이터 연결을 다시 설정한다는 것입니다. 중간에 방화벽이 있으면 큰 문제입니다. ( "이봐, 시스템 관리자, 모든 것을 열어 봐, 알았지?").
JMX가 사용자가 설정 한 것과 동일한 포트에 다시 연결되도록하려면 몇 가지 옵션이 있습니다.
옵션 1 : 명령 줄
-Dcom.sun.management.jmxremote.port=$JMX_REGISTRY_PORT -Dcom.sun.management.jmxremote.rmi.port=$RMI_SERVER_PORT
Spring Boot를 사용한다면 (appname) .jar 배치와 함께 사는 (appname) .conf 파일에 넣을 수 있습니다.
옵션 2 : Tomcat / Tomee 구성
JmxRemoteLifecycleListener 구성 :
메이븐 항아리 :
<dependency> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-catalina-jmx-remote</artifactId> <version>8.5.9</version> <type>jar</type> </dependency>
server.xml 구성 :
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />
옵션 3 : 프로그래밍 방식으로 구성
@Configuration public class ConfigureRMI { @Value("${jmx.rmi.host:localhost}") private String rmiHost; @Value("${jmx.rmi.port:1099}") private Integer rmiPort; @Bean public RmiRegistryFactoryBean rmiRegistry() { final RmiRegistryFactoryBean rmiRegistryFactoryBean = new RmiRegistryFactoryBean(); rmiRegistryFactoryBean.setPort(rmiPort); rmiRegistryFactoryBean.setAlwaysCreate(true); return rmiRegistryFactoryBean; } @Bean @DependsOn("rmiRegistry") public ConnectorServerFactoryBean connectorServerFactoryBean() throws Exception { final ConnectorServerFactoryBean connectorServerFactoryBean = new ConnectorServerFactoryBean(); connectorServerFactoryBean.setObjectName("connector:name=rmi"); connectorServerFactoryBean.setServiceUrl(String.format("service:jmx:rmi://%s:%s/jndi/rmi://%s:%s/jmxrmi", rmiHost, rmiPort, rmiHost, rmiPort)); return connectorServerFactoryBean; } }
트릭은 jmx : rmi 호스트 / 포트와 jndi : rmi 호스트 / 포트를 모두 지정하는 serviceUrl입니다. 둘 다 지정하면 임의의 높은 "문제점"이 발생하지 않습니다.
-
==============================
2.응용 프로그램에서 "$ JAVA_OPTS"에 다음 JVM 등록 정보를 추가하십시오.
응용 프로그램에서 "$ JAVA_OPTS"에 다음 JVM 등록 정보를 추가하십시오.
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=<PORT_NUMBER> -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=<HOST'S_IP>
Jconsole / Visual VM에서 다음을 사용하여 연결합니다.
service:jmx:rmi:///jndi/rmi://<HOST'S_IP>:<PORT_NUMBER>/jmxrmi
보안을 활성화하지는 않지만 원격 서버에 연결하는 데 도움이됩니다.
-
==============================
3.Java 1.8.0_71 및 Spring Boot (1.3.3.RELEASE)에 대한 테스트 된 접근법. 모니터링되는 JVM에 대한 JVM 인수에 아래 매개 변수를 추가하십시오.
Java 1.8.0_71 및 Spring Boot (1.3.3.RELEASE)에 대한 테스트 된 접근법. 모니터링되는 JVM에 대한 JVM 인수에 아래 매개 변수를 추가하십시오.
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12348 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.rmi.port=12349 -Dcom.sun.management.jmxremote.password.file=/somewhere/jmxremote.password -Dcom.sun.management.jmxremote.access.file=/somewhere/jmx/jmxremote.access
com.sun.management.jmxremote.port는 고정 RMI 레지스트리 포트를 정의하는 데 사용되며 com.sun.management.jmxremote.rmi.port는 고정 RMI 포트를 사용하도록 JVM에 지시하는 데 사용되지만 임의 번호는 사용하지 않습니다.
이렇게 설정하면 12348 및 12349 포트를 열어 방금 방화벽을 통해 원격 호스트의 JVM 클라이언트를 모니터링되는 JVM에 연결할 수 있습니다.
필자는 아래의 출력을 생성하는 원격 컴퓨터에서 java -jar cmdline-jmxclient-0.10.3.jar 사용자 : pwd hostip : 12348을 사용하여 테스트했습니다 (데모 용으로 줄임).
java.lang:type=Runtime java.lang:name=PS Scavenge,type=GarbageCollector Tomcat:J2EEApplication=none,J2EEServer=none,WebModule=//localhost/,j2eeType=Filter,name=requestContextFilter java.nio:name=mapped,type=BufferPool Tomcat:host=localhost,type=Host java.lang:name=Compressed Class Space,type=MemoryPool .......
항아리는 여기에서 다운로드됩니다.
from https://stackoverflow.com/questions/29412072/how-to-access-spring-boot-jmx-remotely by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 3에서 최대 절전 모드 세션을 삽입하는 가장 좋은 방법 (0) | 2018.12.22 |
---|---|
[SPRING] Spring DispatcherServlet을 사용하는 Custom 404 (0) | 2018.12.22 |
[SPRING] 왜 서비스 계층을 사용합니까? (0) | 2018.12.22 |
[SPRING] Spring RESTTemplate을 사용하는 Generics (0) | 2018.12.22 |
[SPRING] javax.transaction.Transactional 대 org.springframework.transaction.annotation.Transactional (0) | 2018.12.22 |