2014-02-05 45 views
0

考虑此设置: JMX Server with multiple clientsJMX/RMI那里的服务器没有全球唯一的网络名称

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

我正在寻找如何在以下情况下解决这个问题,建议:

  1. 在那里我有过JMX客户端和服务器JMX的源代码控制。

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

要解决的基本问题是,在RMI世界中,服务器端决定客户端应该如何连接(对吧?)。所以设置例如HostX上的java.rmi.server.hostname不会提供帮助。正如我所看到的,我只能使HostA快乐或HostB快乐,但不能同时进行。

如果所有的客户端都使用相同的名称来访问它,那么RMI服务器是否只能工作?

+0

可你以相同的名称解析为不同的IP解决这个问题?因此,HostA在查找'hostx'时获取内部IP,而HostB获取阴影IP? – Gray

+0

我无法控制JMX解决方案部署到的环境。 – peterh

回答

0

您的结论是正确的。这是RMI的一个设计缺陷。有一个潜在的假设,即有一个“最公开的”主机名或IP地址,通过它,每个人都可以联系服务器主机。

您关于主机在存根中嵌入自己的名称或地址的声明也是正确的。

+0

感谢您的验证。尽管我暗中希望自己错了,但确认我的假设对我来说很有价值。 :-)我会接受这个答案。 – peterh

+1

如果您可以找到java-RMI邮件列表存档,那么在十年前或更早之前就已经讨论过了。有一个解决方案,但首先它需要改变RMI(我当时建议),其次它需要Sun/Oracle接受问题的存在,并且交换机会看到这是永远不会发生的发生。 – EJP

+0

LoL。就不需要更改RMI本身的解决方法而言,我刚刚发现[this](http://conditional-logic.blogspot.dk/2010/10/jmx-over-nat-with-rmi-connector的.html)。我认为这很聪明。只适用于上面的情景1,并有很多警告..但聪明的想法。 – peterh

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

+0

嗯。是。我只是无法弄清楚该连接器的官方状态与rmi连接器有什么区别?他们工作同样好,快,稳定吗?如果我有问题怎么办?对于rmi来说似乎有很多知识(仍然),但是关于jmxmp呢?但事实是,从谷歌搜索看来,人们似乎对jmxmp有着积极的体验。 – peterh

0

要解决的基本问题是,在RMI世界中,服务器端决定客户端应该如何连接(对吧?)。所以设置例如HostX上的java.rmi.server.hostname不会提供帮助。正如我所看到的,我只能使HostA快乐或HostB快乐,但不能同时进行。

这不会帮助你,但对于其他人,招做的是设置java.rmi.server.hostname系统属性的名称,这意味着在主机A的东西是在防火墙内,但另一件事主机B是外。

例如,在EC2土地,我们设置主机名属性是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。亚马逊默认做这个DNS工作。您可能需要根据需要调整/etc/hosts文件以使名称正确。

有关EC2和JMX的详细信息,请参阅:How to connect to Java instances running on EC2 using JMX

+0

灰色,我在原始发布中已经提到'java.rmi.server.hostname',为什么它没有帮助。但是,谢谢。 – peterh