jmx rmi 穿越防火墙问题及jmxmp的替代方案
2019獨角獸企業重金招聘Python工程師標準>>>
jmx rmi 穿越防火墻問題及jmxmp的替代方案 博客分類: java前段時間遇到jmx使用rmi協議進行連接穿越防火墻的問題,查了很久終于查到了原因。
? ? ??
1.?????對rmi的工作方式進行了了解,發現jmx如果采用rmi作為傳輸協議的話,客戶端需要進行兩個連接,如:JMXConnectorServer的JMXServiceURL為如下形式:service:jmx:rmi://localhost:5000/jndi/rmi://localhost:6000/jmxrmi
則首先客戶端連接到rmiregistry上得到真實服務器的stub(如rmi://localhost:6000/rmxrmi),然后客戶端再根據該stub連接到真實的服務器上(如rmi://localhost:5000)。如果jmx服務端省略了藍色部分的標注,默認的通信端口是隨機產生的。針對目前現網的情況,如果現網只開放了一個注冊端口,如果要通過防火墻進行通信還需要開放一個通信端口,另外jmx服務端也需要固定通信端口。
? ?通過在防火墻上開放兩個端口一般能夠解決穿越防火墻的問題,但針對防火墻做了內外網IP映射情況,還需要增加額外的配置,使服務端帶回的stub為外網IP而非內網IP ,System.setProperty("java.rmi.server.hostname","外網IP");比解決方案沒有驗證,具體可參見http://blog.csdn.net/ktyl2000/article/details/4485896
?
2 ?為避開rmi穿越防火墻問題,通常采用jmx消息協議(jmxmp)來代替rmi,使用jmxmp協議較為簡單,并且服務端不需要進行端口注冊過程,使用jmxmp的相關代碼如下:
服務端:
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協議,客戶端和服務端均需要增加jmxremote_optionnal.jar
?
3 ?由于我運行的程序均在OSGI環境下作為獨立bundle進行啟動,開發為bundle的過程中,由于類加載問題,通常要么提示不支持jmxmp,要么找不到一些其他類。
? ? 針對這兩個問題:
?客戶端的修改:
? ? ? ?要支持jmxmp協議,需要在客戶端連接之前設置環境map,如:
? ? ? ?Map<String, Object> env = new HashMap<String, Object>();?
? ? ? ?env.put(JMXConnectorServerFactory.PROTOCOL_PROVIDER_PACKAGES,?? "com.sun.jmx.remote.protocol.jmxmp"); 否則可能加載不到jmxmp相關的connector
? ? ? 另外jmx類加載過程中按照雙親委派機制,加載不到javax開頭的包中的類,因此在客服端環境map中還需要設置默認類加載器
? ? ??env.put(JMXConnectorServerFactory.DEFAULT_CLASS_LOADER,JMXConnectorServerFactory.class.getClassLoader());
? ?客戶端連接的代碼第二個參數改成環境map,如JMXConnectorFactory.connect(new JMXServiceURL(jmxUrl),env);
? ?并且客戶端實際需要三個jar包?jmxremote_optional.jar 、jmxremote.jar、jmxri.jar
服務端的修改:
? ? ? 服務端代碼不需要修改,除了jmxremote_optional.jar外,還需要增加jmxremote.jar這個包。
?
根據此可以在OSGI環境下成功支持jmxmp協議的連接。
??
http://blog.csdn.net/yangyan19870319/article/details/7244403
轉載于:https://my.oschina.net/xiaominmin/blog/1597133
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的jmx rmi 穿越防火墙问题及jmxmp的替代方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ionic3使用@angular/htt
- 下一篇: ActiveMQ的消息重发策略和DLQ处