복붙노트

[SPRING] 스프링 부트 JMX에 원격으로 액세스하는 방법

SPRING

스프링 부트 JMX에 원격으로 액세스하는 방법

스프링이 자동으로 JMX 빈을 노출한다는 것을 알고 있습니다. VisualVM을 사용하여 로컬에서 액세스 할 수있었습니다.

그러나 찌르다 보면 JMX beans를 사용하여 원격으로 앱에 연결할 수 있습니까? 기본 포트가 있습니까? 아니면 추가로 아무것도 정의해야합니까?

감사, 레이.

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    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
    .......
    

    항아리는 여기에서 다운로드됩니다.

  4. from https://stackoverflow.com/questions/29412072/how-to-access-spring-boot-jmx-remotely by cc-by-sa and MIT license