考虑这个设置:
所以有一个JMX服务器,我们希望它可以从不同的JMX客户端访问,但问题是这些不同的JMX客户端通过不同的名称/地址知道HostX。为了举例说明,HostA通过名称hostx
知道HostX,但HostB通过名称hostxshadow
知道HostX。
我正在寻找有关如何在以下情况下解决此问题的建议:
我可以控制JMX客户端和JMX服务器的源代码。
我无法控制源代码,即我可以在JVM上设置系统属性,但就是这样。
要解决的基本问题是在RMI领域,服务器端决定客户端应该如何连接(对吗?)。所以设置例如HostX上的java.rmi.server.hostname
无法提供帮助。正如我所看到的,我只能让HostA高兴或HostB高兴,但不能同时满足两者。
结论是否真的是任何RMI服务器只能在所有客户端使用相同名称访问它的情况下才能工作?
答案 0 :(得分:1)
你的结论是正确的。这是RMI的设计缺陷。有一个潜在的假设是,有一个“最公开”的主机名或IP地址,每个人都可以通过它来联系服务器主机。
关于主机在存根中嵌入自己的名称或地址的声明也是正确的。
答案 1 :(得分:0)
RMI是JMX的一种可能传输方式。另一个解决方案是JMXMP,切换到它非常简单,请查看http://meteatamel.wordpress.com/2012/02/13/jmx-rmi-vs-jmxmp/或 http://blog.markfeeney.com/2010/10/jmx-through-ssh-tunnel.html
答案 2 :(得分:0)
要解决的基本问题是在RMI领域,服务器端决定客户端应该如何连接(对吗?)。所以设置例如HostX上的java.rmi.server.hostname无济于事。正如我所看到的,我只能让HostA高兴或HostB高兴,但不能同时满足两者。
这不会对你有所帮助,但对于其他人来说,要做的诀窍是将java.rmi.server.hostname
系统属性设置为一个名称,这个名称意味着HostA在防火墙内部,而另一个东西是HostB,这是外部。
例如,在EC2 land中,我们将hostname属性设置为EC2节点的“公共主机名”,我们通过以下方式获取:
wget -q -O - http://169.254.169.254/latest/meta-data/public-hostname
这可以解释为:
ec2-54-1-2-3.compute-1.amazonaws.com
在盒子本身以及EC2内部的任何其他内容上,这将解析为10.1.2.3
,而在外部世界,它将解析为面向外部的IP 54.1.2.3
。 Amazon默认执行此DNS工作。您可能需要根据需要调整/etc/hosts
文件以使名称正确。
有关EC2和JMX的更多详细信息,请参阅:How to connect to Java instances running on EC2 using JMX