如何远程访问 Spring-boot JMX

新手上路,请多包涵

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

但是在产品上,我如何使用它的 JMX bean 远程连接到应用程序?是否有默认端口或者我应该另外定义任何东西?

谢谢,雷。

原文由 rayman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

默认情况下,JMX 可以在本地自动访问,因此在 本地 运行 jconsole 将检测到所有本地 Java 应用程序而不会暴露端口。

要通过 JMX 远程 访问应用程序,您必须指定 RMI 注册表端口。要知道的是,在连接时,JMX 在该端口上初始化, 然后随机高 端口上建立数据连接,如果中间有防火墙,这是一个大问题。 (“嘿,系统管理员,打开一切,好吗?”)。

要强制 JMX 在您建立的同一端口上重新连接,您有以下几个选项。注意:您可以为 JMX 和 RMI 使用不同的端口,也可以使用相同的端口。

选项 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;
    }
}

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

编辑: 要使 JMX 远程工作,您需要做出关于身份验证的决定。最好分 3 个不同的步骤进行:1) 使用 -Dcom.sun.management.jmxremote.authenticate=false 进行基本设置,然后 2) 添加密码文件 ( -Dcom.sun.management.jmxremote.password.file )。 有关说明,请参见此处。 + -Dcom.sun.management.jmxremote.ssl=false 然后 3) 设置 SSL。

原文由 inanutshellus 发布,翻译遵循 CC BY-SA 4.0 许可协议

在“$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

它不会启用安全性,但会帮助您连接到远程服务器。

原文由 Arnab Biswas 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题