如何远程访问Spring-boot JMX

我知道spring会自动公开JMX bean。我可以使用VisualVM在本地访问它。

但是在产品上,如何使用JMX bean远程连接到应用程序?是否有默认端口,或者我还应该定义其他任何内容?

回答:

默认情况下,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" title="Spring Boot">Spring Boot,则可以将其放入(appname).conf与(appname).jar部署一起存在的文件中。

选项2:Tomcat / Tomee配置

配置一个JmxRemoteLifecycleListener:

Maven Jar:

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

}

}

你将看到的窍门是serviceUrl在其中指定jmx:rmi主机/端口和jndi:rmi主机/端口。如果同时指定两者,则不会出现随机的高“问题”。

以上是 如何远程访问Spring-boot JMX 的全部内容, 来源链接: utcz.com/qa/428889.html

回到顶部