2015-04-02 14 views
17

Ich weiß, dass die Feder JMX-Bohnen automatisch freigibt. Ich konnte mit VisualVM lokal darauf zugreifen.Zugriff auf Spring-Boot JMX aus der Ferne

Aber auf Prod, wie kann ich mit der App über JMX-Beans remote verbinden? Gibt es einen Standardport oder sollte ich zusätzlich etwas definieren?

Danke, Strahl.

Antwort

24

Standardmäßig ist JMX automatisch lokal zugreifbar, so dass jconsolelokal alle Ihre lokalen Java-Anwendungen ohne Port-Exposition erkennen würde.

Um über JMX Remote auf eine App zuzugreifen, müssen Sie einen RMI-Registry-Port angeben. Die Sache zu wissen ist, dass beim Verbinden, JMX initialisiert an diesem Port und dann stellt eine Datenverbindung zurück auf einem Random High Port, die ein großes Problem ist, wenn Sie eine Firewall in der Mitte haben. ("Hey sysadmins, öffne einfach alles, mkay?").

JMX Um zu erzwingen, auf dem gleichen Port zu verbinden zurück, wie Sie festgestellt haben, haben Sie ein paar Optionen:

Option 1: Befehlszeile

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

Wenn Sie Frühling verwenden Boot können Sie dies in Ihre (appname).conf Datei, die neben Ihrer (appname).jar Bereitstellung lebt.

Option 2: Tomcat/Tomee Konfiguration

Konfigurieren eines JmxRemoteLifecycleListener:

Maven Jar:

<dependency> 
     <groupId>org.apache.tomcat</groupId> 
     <artifactId>tomcat-catalina-jmx-remote</artifactId> 
     <version>8.5.9</version> 
     <type>jar</type> 
    </dependency> 

dem Server konfigurieren.xml:

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" 
     rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" /> 

Option 3: konfigurieren programmatisch

@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; 
    } 
} 

Der Trick, werden Sie sehen, ist die serviceUrl, in dem Sie sowohl die JMX angeben: rmi Host/Port und die jndi: rmi Host/Port. Wenn Sie beide angeben, erhalten Sie nicht das zufällige hohe "Problem".

+1

Schließt dieser Ansatz die Verwendung der 'JAVA_OPTS'-Methode aus? – raffian

0

Ja, wenn Sie in der Linux-Box laufen, dann müssen Sie den Port in IPtables, Port konfigurieren, die zu JMX gehören.
Sie müssen auch IP-Adresse auf Client m/c einrichten, damit nur Ihre m/c darauf zugreifen kann.

17

Fügen Sie die folgenden JVM-Eigenschaften in "$ JAVA_OPTS" (in der Anwendung):

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

Im JConsole/Visual-VM verwenden Sie die folgenden verbinden:

service:jmx:rmi:///jndi/rmi://<HOST'S_IP>:<PORT_NUMBER>/jmxrmi 

Es ist nicht Aktivieren Sie die Sicherheit, aber Sie können sich mit dem Remote-Server verbinden.

1

Ein getesteter Ansatz für Java 1.8.0_71 und Spring Boot (1.3.3.RELEASE). Unter Parameter an JVM-Argumente für überwachte JVM anhängen.

-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 

Die com.sun.management.jmxremote.port wird verwendet JVM zu definieren, wird das feste RMI-Registry-Port und die com.sun.management.jmxremote.rmi.port verwendet anweisen, gelegentliche verwenden feste RMI-Port, aber nicht verwenden.

Durch diese Einstellung kann ich JVM-Client von Remote-Host auf die überwachte JVM über eine Firewall nur 12348 und 12349 Port zu öffnen verbinden.

Ich getestet mit java -jar cmdline-jmxclient-0.10.3.jar user:pwd hostip:12348 auf einer Remote-Maschine, die unterhalb der Ausgabe erzeugt (verkürzt nur für die Demonstration).

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

Das Glas wird von Here heruntergeladen.

Verwandte Themen