JMX(Java Management Extensions) 是一个为应用程序提供管理功能的框架。也就是应用程序暴露一个端口,可以通过这个端口,查看程序的状态,修改程序的配置。
网上关于程序员四个层次,很形象说明JMX的功能。
程序新手,配置是写死在程序中,修要修改时就去改代码,然后重新编译发布。程序熟手,配置在文件中(JAVA一般都是properties文件),修要修改时就去修改配置文件,但还是必须重启系统,以便读取配置文件里最新的值。程序好手,则会写一段代码,把配置值缓存起来,系统在获取的时候,先看看配置文件有没有改动,如有改动则重新从配置里读取,否则从缓存里读取。程序高手,则懂得物为我所用,用JMX把需要配置的属性集中在一个类中,然后写一个MBean,再进行相关配置。另外JMX还提供了一个工具页,以方便我们对参数值进行在线修改。一开始我认为JMX只有一个端口,实际是开了三个端口,分别是:
一个是JMX端口(需要指定),JMX远程连接端口。一个是RMI端口(默认随机),实际通信用的端口。一个是本地服务端口(随机),用于本地jstat、jconsole连接用,本地使用,我们不用理会。程序连接,是先连上JMX端口,获取RMI端口,再连接RMI端口,问题就出在RMI端口上,一般没有配置指定端口号,程序默认会随机分配一个端口,容易让人忽略,在配置防火墙时只配了JMX端口,导致JMX连接不上。而且RMI端口是随机的,也不好配防火墙。
其实这个RMI端口是可以指定的,而且可以指定与JMX一致的端口,这样在配置防火墙时就方便多了,只需开放一个端口。 具体的配置是启动参数增加 -Dcom.sun.management.jmxremote.rmi.port=xxxx,目前常见的开源软件都支持这个配置,如Kafka,Tomcat等。