为什么应该设置 com.sun.management.jmxremote.rmi.port?

原文地址:https://alphahinex.github.io/2020/07/26/why-should-set-jmxremote-rmi-port/

cover

description: "不设置貌似也没问题啊"
date: 2020.07.26 19:26
categories:
- Java
tags: [Java]
keywords: Java, JMX, RMI, Firewall


在使用 JMX 对 Java 应用进行监控时,一般会在启动时添加如下参数:

java \
-Djava.rmi.server.hostname=192.168.16.237 \
-Dcom.sun.management.jmxremote.rmi.port=2909 \
-Dcom.sun.management.jmxremote.port=9009 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar test.jar

后三个参数在 Oracle 官方文档 Monitoring and Management Using JMX Technology 中均有描述,但前两个参数直到 JDK9 版本的文档 中才有所提及。

java.rmi.server.hostname 为需要远程连接时必须设置的参数,否则只能从本地对应用进行监控,无法从远程机器进行连接。

那么 com.sun.management.jmxremote.rmi.port 这个参数指定的端口是干什么用的呢?

按上面启动命令所示,使用 jmx 进行连接的时候使用的是 com.sun.management.jmxremote.port 参数指定的端口,com.sun.management.jmxremote.rmi.port 这个参数去掉好像也没什么影响,依然能够进行远程连接,那么为什么还要设置这个参数呢?

先来看一下 官方文档 中关于这个参数为数不多的描述:

To enable monitoring and management from remote systems, you must set the following system property when you start the Java VM:

com.sun.management.jmxremote.port=portNum

Where, portNum is the port number to enable JMX RMI connections. Ensure that you specify an unused port number. In addition to publishing an RMI connector for local access, setting this property publishes an additional RMI connector in a private read-only registry at the specified port using the name, jmxrmi. The port number to which the RMI connector will be bound using the system property:

com.sun.management.jmxremote.rmi.port

Ensure to use an unused port number.

大意为,使用 com.sun.management.jmxremote.port 指定端口后,除了在这个端口上会创建一个 RMI 连接器之外,还会额外创建另一个连接器,而这个额外创建的连接器的端口,就可以通过 com.sun.management.jmxremote.rmi.port 参数来指定。

这个额外连接器的端口,在我们进行监控的时候并没有使用到,而且不进行指定也会随机使用一个端口,那为什么还要指定呢?

一探究竟

让我们使用 docker 来模拟一个网络访问受限的环境,看一看这个参数的影响。

准备 Java 应用

先准备一个用来监控的 Java 应用。比如可以从 https://github.com/AlphaHinex/spring-roll 通过 ./gradlew bootJar,在 modules/roll-application/build/libs 路径获得一个 Spring Boot 的 Fat Jar。

Docker Compose

然后在 Java 应用路径,创建一个 docker-compose.yml 文件,内容参考如下:

jmx:
  image: openjdk:8u171-jre
  volumes:
    - ./roll.jar:/opt/jmx/roll.jar
  command: java -Djava.rmi.server.hostname=192.168.16.237 -Dcom.sun.management.jmxremote.port=9009 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar /opt/jmx/roll.jar
  ports:
    - "9009:9009"

仅指定及开放 jmxremote.port

按照上述 docker-compose.yml 内容,执行 docker-compose up jmx,之后使用 jvisualvmjconsole 等工具,连接 9009 端口,会发现无法正常进行连接。

指定并开放 rmi.port

docker-compose.yml 调整为如下内容:

jmx:
  image: openjdk:8u171-jre
  volumes:
    - ./roll.jar:/opt/jmx/roll.jar
  command: java -Djava.rmi.server.hostname=192.168.16.237 -Dcom.sun.management.jmxremote.rmi.port=2909 -Dcom.sun.management.jmxremote.port=9009 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar /opt/jmx/roll.jar
  ports:
    - "9009:9009"
    - "2909:2909"

此时在通过 JMX 连接 9009 端口,会发现可以正常的进行监控了。

总结

当存在防火墙等网络访问限制时,可通过 com.sun.management.jmxremote.rmi.port 参数指定 RMI 连接器所使用的端口并进行开放。在这种场景下,必须设置此参数。

另外,com.sun.management.jmxremote.rmi.port 使用的端口,可以与 com.sun.management.jmxremote.port 指定的端口相同,这样仅开放一个端口就可以了,比如:

jmx:
  image: openjdk:8u171-jre
  volumes:
    - ./roll.jar:/opt/jmx/roll.jar
  command: java -Djava.rmi.server.hostname=192.168.16.237 -Dcom.sun.management.jmxremote.rmi.port=9009 -Dcom.sun.management.jmxremote.port=9009 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar /opt/jmx/roll.jar
  ports:
    - "9009:9009"
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容