Java JMX/RMI在哪里';服务器没有全局唯一的网络名称

Java JMX/RMI在哪里';服务器没有全局唯一的网络名称,java,rmi,jmx,Java,Rmi,Jmx,考虑以下设置: 所以有一个JMX服务器,我们希望它可以从不同的JMX客户端访问,但问题是这些不同的JMX客户端通过不同的名称/地址知道HostX。为了便于示例,假设HostA知道HostX的名字是HostX,而HostB知道HostX的名字是hostxshadow 我正在寻找在以下情况下如何解决此问题的建议: 我可以控制JMX客户机和JMX服务器的源代码 我无法控制源代码,也就是说,我可以在JVM上设置系统属性,但仅此而已 需要解决的基本问题是,在RMI世界中,服务器端决定客户端应该如何连接(

考虑以下设置:

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

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

  • 我可以控制JMX客户机和JMX服务器的源代码

  • 我无法控制源代码,也就是说,我可以在JVM上设置系统属性,但仅此而已

  • 需要解决的基本问题是,在RMI世界中,服务器端决定客户端应该如何连接(对吗?)。因此,在HostX上进行设置是没有帮助的。在我看来,我只能让HostA或HostB高兴,但不能同时让两者都高兴


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

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


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

    RMI是JMX的一种可能传输方式。另一个解决方案是JMXMP,切换到它非常简单,请在或处进行检查

    需要解决的基本问题是,在RMI世界中,服务器端决定客户端应该如何连接(对吗?)。因此,在HostX上设置java.rmi.server.hostname并没有帮助。在我看来,我只能让HostA或HostB高兴,但不能同时让两者都高兴

    这对您没有帮助,但对其他人来说,诀窍是将
    java.rmi.server.hostname
    系统属性设置为一个名称,该名称表示防火墙内部的主机a上的某个内容,但表示防火墙外部的主机B上的另一个内容

    例如,在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的更多详细信息,请参阅:

    您可以通过将相同的名称解析到不同的IP来解决此问题吗?所以HostA在查找
    hostx
    时获取内部IP,而HostB获取影子IP?我无法控制JMX解决方案部署到的环境。格雷,我在最初的帖子中已经提到了
    java.rmi.server.hostname
    ,以及为什么它没有帮助。但是谢谢,谢谢你的验证。验证我的假设对我来说很有价值,尽管我暗自希望我错了。:-)我接受这个答案。如果你能找到JavaRMI邮件列表存档,它在十年或更多年前就已经在那里讨论过了。有一个解决方案,但首先它需要对RMI进行更改(我当时建议这样做),其次它需要Sun/Oracle接受问题的存在,您将从exchange中看到这是永远不会发生的。LoL。我刚刚发现了一种不需要对RMI本身进行更改的变通方法。我认为这很聪明。仅在上面的场景1中有效,并且有很多警告。。但是聪明的想法。对我就是搞不清楚,与rmi连接器相比,该连接器的官方状态是什么?它们是否同样工作良好、快速、稳定?如果我有问题怎么办?rmi似乎有很多知识(仍然),但jmxmp呢?。但确实,从谷歌上看,人们似乎对jmxmp有着积极的体验。