JMX / RMI,其中没有服务器的全局唯一网络名称

时间:2014-02-05 14:52:54

标签: java rmi jmx

考虑这个设置: JMX Server with multiple clients

所以有一个JMX服务器,我们希望它可以从不同的JMX客户端访问,但问题是这些不同的JMX客户端通过不同的名称/地址知道HostX。为了举例说明,HostA通过名称hostx知道HostX,但HostB通过名称hostxshadow知道HostX。

我正在寻找有关如何在以下情况下解决此问题的建议:

  1. 我可以控制JMX客户端和JMX服务器的源代码。

  2. 我无法控制源代码,即我可以在JVM上设置系统属性,但就是这样。

  3. 要解决的基本问题是在RMI领域,服务器端决定客户端应该如何连接(对吗?)。所以设置例如HostX上的java.rmi.server.hostname无法提供帮助。正如我所看到的,我只能让HostA高兴或HostB高兴,但不能同时满足两者。

    结论是否真的是任何RMI服务器只能在所有客户端使用相同名称访问它的情况下才能工作?

3 个答案:

答案 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