web-dev-qa-db-ja.com

Spring-boot JMXにリモートでアクセスする方法

春は自動的にJMX Beanを公開することを知っています。 VisualVMを使用してローカルにアクセスできました。

しかし、どのようにJMX Beanを使用してアプリにリモートで接続できますか?デフォルトのポートはありますか、それとも何か定義する必要がありますか?

ありがとう、レイ。

28
rayman

デフォルトでは、JMXはローカルで自動的にアクセスできるため、jconsolelocallyを実行すると、ポートを公開せずにすべてのローカルJavaアプリを検出します。

JMXremotely経由でアプリにアクセスするには、RMIレジストリポートを指定する必要があります。知っておくべきことは、接続すると、JMXはそのポートで初期化し、thenがデータ接続を確立することですランダムな高ポートに戻ります。これは、ファイアウォールが中央にある場合には大きな問題です。 (「システム管理者、すべてを開いてください、ねえ」)。

確立したのと同じポートにJMXを強制的に接続し直すには、いくつかのオプションがあります。

オプション1:コマンドライン

-Dcom.Sun.management.jmxremote.port=$JMX_REGISTRY_PORT 
-Dcom.Sun.management.jmxremote.rmi.port=$RMI_SERVER_PORT

Spring Bootを使用している場合、これを(appname).confあなたの(appname).jar展開。

オプション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です。両方を指定すると、ランダムな高い「問題」は発生しません。

43
inanutshellus

(アプリケーション内の)「$ 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

セキュリティは有効になりませんが、リモートサーバーへの接続に役立ちます。

26
Arnab Biswas

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

Jarは Here からダウンロードされます。

3
Popeye