jmx rmi 穿越防火墙问题及jmxmp的替代方案
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
jmx rmi 穿越防火墻問題及jmxmp的替代方案 博客分類: java前段時(shí)間遇到j(luò)mx使用rmi協(xié)議進(jìn)行連接穿越防火墻的問題,查了很久終于查到了原因。
? ? ??
1.?????對(duì)rmi的工作方式進(jìn)行了了解,發(fā)現(xiàn)jmx如果采用rmi作為傳輸協(xié)議的話,客戶端需要進(jìn)行兩個(gè)連接,如:JMXConnectorServer的JMXServiceURL為如下形式:service:jmx:rmi://localhost:5000/jndi/rmi://localhost:6000/jmxrmi
則首先客戶端連接到rmiregistry上得到真實(shí)服務(wù)器的stub(如rmi://localhost:6000/rmxrmi),然后客戶端再根據(jù)該stub連接到真實(shí)的服務(wù)器上(如rmi://localhost:5000)。如果jmx服務(wù)端省略了藍(lán)色部分的標(biāo)注,默認(rèn)的通信端口是隨機(jī)產(chǎn)生的。針對(duì)目前現(xiàn)網(wǎng)的情況,如果現(xiàn)網(wǎng)只開放了一個(gè)注冊(cè)端口,如果要通過防火墻進(jìn)行通信還需要開放一個(gè)通信端口,另外jmx服務(wù)端也需要固定通信端口。
? ?通過在防火墻上開放兩個(gè)端口一般能夠解決穿越防火墻的問題,但針對(duì)防火墻做了內(nèi)外網(wǎng)IP映射情況,還需要增加額外的配置,使服務(wù)端帶回的stub為外網(wǎng)IP而非內(nèi)網(wǎng)IP ,System.setProperty("java.rmi.server.hostname","外網(wǎng)IP");比解決方案沒有驗(yàn)證,具體可參見http://blog.csdn.net/ktyl2000/article/details/4485896
?
2 ?為避開rmi穿越防火墻問題,通常采用jmx消息協(xié)議(jmxmp)來代替rmi,使用jmxmp協(xié)議較為簡單,并且服務(wù)端不需要進(jìn)行端口注冊(cè)過程,使用jmxmp的相關(guān)代碼如下:
服務(wù)端:
public class TestJmxmpServer {
? public static void main(String[] args)throws IOException{
?MBeanServer platform = ManagementFactory.getPlatformMBeanServer();
? ? ?String serviceURL="service:jmx:jmxmp://localhost:9877/ogsi";
? ? JMXConnectorServer connectServer = JMXConnectorServerFactory.newJMXConnectorServer(new JMXServiceURL(serviceURL), null, platform);
? ? ?connectServer.start();
? ? ?System.out.println("server start success");
?}
?
? }
客戶端:
public class TestClient {
? public static void main(String[] args){
?try {
JMXConnector jmxConnector = JMXConnectorFactory.connect(new JMXServiceURL("service:jmx:jmxmp://localhost:9877/osgi"));
MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection();
if(mbsc!=null){
System.out.println("success");
}
?} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
? }
}
為了支持jmxmp協(xié)議,客戶端和服務(wù)端均需要增加jmxremote_optionnal.jar
?
3 ?由于我運(yùn)行的程序均在OSGI環(huán)境下作為獨(dú)立bundle進(jìn)行啟動(dòng),開發(fā)為bundle的過程中,由于類加載問題,通常要么提示不支持jmxmp,要么找不到一些其他類。
? ? 針對(duì)這兩個(gè)問題:
?客戶端的修改:
? ? ? ?要支持jmxmp協(xié)議,需要在客戶端連接之前設(shè)置環(huán)境map,如:
? ? ? ?Map<String, Object> env = new HashMap<String, Object>();?
? ? ? ?env.put(JMXConnectorServerFactory.PROTOCOL_PROVIDER_PACKAGES,?? "com.sun.jmx.remote.protocol.jmxmp"); 否則可能加載不到j(luò)mxmp相關(guān)的connector
? ? ? 另外jmx類加載過程中按照雙親委派機(jī)制,加載不到j(luò)avax開頭的包中的類,因此在客服端環(huán)境map中還需要設(shè)置默認(rèn)類加載器
? ? ??env.put(JMXConnectorServerFactory.DEFAULT_CLASS_LOADER,JMXConnectorServerFactory.class.getClassLoader());
? ?客戶端連接的代碼第二個(gè)參數(shù)改成環(huán)境map,如JMXConnectorFactory.connect(new JMXServiceURL(jmxUrl),env);
? ?并且客戶端實(shí)際需要三個(gè)jar包?jmxremote_optional.jar 、jmxremote.jar、jmxri.jar
服務(wù)端的修改:
? ? ? 服務(wù)端代碼不需要修改,除了jmxremote_optional.jar外,還需要增加jmxremote.jar這個(gè)包。
?
根據(jù)此可以在OSGI環(huán)境下成功支持jmxmp協(xié)議的連接。
??
http://blog.csdn.net/yangyan19870319/article/details/7244403
轉(zhuǎn)載于:https://my.oschina.net/xiaominmin/blog/1597133
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的jmx rmi 穿越防火墙问题及jmxmp的替代方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ionic3使用@angular/htt
- 下一篇: ActiveMQ的消息重发策略和DLQ处