2014-02-05 40 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