Как получить доступ к Spring-boot JMX удаленно

Я знаю, что весна автоматически выставляет JMX-компоненты. Я смог получить доступ к нему локально с помощью VisualVM.

Однако, как я могу подключиться к удаленному приложению, используя его JMX-компоненты? Есть ли порт по умолчанию, или я должен что-то определить?

Спасибо, луч.

По умолчанию 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).conf файл, который живет рядом с вашим (appname).jar развертыванием.

Вариант 2: конфигурация Tomcat / Tomee

Настройте JmxRemoteLifecycleListener :

Maven Jar:

   org.apache.tomcat tomcat-catalina-jmx-remote 8.5.9 jar  

Настройте свой server.xml:

  

Вариант 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 – это serviceUrl в котором вы указываете как хост / порт jmx: rmi, так и хост / порт jndi: rmi. Если вы укажете оба варианта, вы не получите случайную высокую «проблему».

Добавьте следующие JVM-свойства в «$ JAVA_OPTS» (в вашем приложении):

 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port= -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname= 

В Jconsole / Visual VM для подключения:

 service:jmx:rmi:///jndi/rmi://:/jmxrmi 

Он не включает безопасность, но поможет вам подключиться к удаленному серверу.

Проверенный подход на 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 используется для указания JVM использовать фиксированный порт RMI, но НЕ использовать случайный.

Установив это, я могу подключить JVM-клиент от удаленного хоста к контролируемой JVM через брандмауэр, только открывая порты 12348 и 12349.

Я тестировал с помощью 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 ....... 

Банку загружают отсюда .

Interesting Posts

Есть ли способ получить метаданные файлов из командной строки?

Как безопасно разбить жесткий диск, чтобы принять дистрибутив GNU / Linux в присутствии OneKey Recovery?

Если я обновляю окна с 7 по 8 на одном диске, я могу скопировать установку на другой диск?

Eclipse: как мы принимаем аргументы для main при запуске

Разберите ifconfig, чтобы получить только мой IP-адрес, используя Bash

Как получить форматированный JSON в .NET с помощью C #?

Запуск кэширующего DNS-сервера в локальной сети

Разница между ApiController и controllerом в ASP.NET MVC

свойство навигации должно быть виртуальным – не требуется в ef core?

Блокировка клавиатуры – Игнорировать ввод, оставить работу мыши

Windows 10 ScrollIntoView () не прокручивает элементы в середине списка

Приращение iteratorов: ++ это более эффективно, чем это ++?

Использование антистатического браслета для ног против ноутбука

Достаточно ли перенаправлять изображения HTTP?

Получить имя места из выбранных координат

Давайте будем гением компьютера.