`
m635674608
  • 浏览: 4929181 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

分享到:
评论
1 楼 xu982604405 2018-12-28  
System.setProperty("java.rmi.server.hostname","外网IP"); 这个有效,我的问题就是在这,加上就可以了

相关推荐

    JMX以RMI方式连接的场景示例

    JMX以RMI方式连接的场景示例,从“服务器A远程获取服务器B的历史IP访问记录”这一场景出发,将JMX框架的各层简单的串了一遍。其中包括了MBean、Agent、Client每个层的详细代码和说明

    jmx 实例 rmi mbean

    jmx 实例 rmi mbean,采用rmi方式进行jmx的mbean管理,通过这个实例能够了解jmx的应用

    jmx监控activeMQ监控

    activeMQ开启jmx固定rmi端口,穿透防火墙,用了一天的时间,踩了无数的坑,拿出来共享.

    使用RMI远程连接JVM.用JMX获取JVM的参数

    使用RMI远程连接JVM.用JMX获取JVM的参数.

    JMX实战 JMX开发

    书中不仅有对于基础知识的介绍,还有对于JMX开发中重大的体系架构问题的深入探讨,总结了大量JMX开发中的设计模式,并讨论了框架、安全性与性能等等。书中提供了几个典型的例子,兼顾各种开发平台,这些例子的代码...

    xmemcached1.3.5源码-附带自己写的RMI调用它的JMX服务

    xmemcached1.3.5源码-附带自己写的RMI调用它的JMX服务,使用RMI调用JMX服务的详细过程,完整的eclipse工程,直接导入即可用。还用一些运行截图,很有用。 自己写的例子,类名是BaseExample 和RMITest.

    实现JMX的spring支持,拓展了RMI远程接口。

    JMX集成到spring中,并提供了一个rmi远程连接的配置文件

    jmx监控tomcat测试包

    set CATALINA_OPTS=%CATALINA_OPTS% -Djava.rmi.server.hostname=JMX_HOST set CATALINA_OPTS=%CATALINA_OPTS% -Djavax.management.builder.initial= set CATALINA_OPTS=%CATALINA_OPTS% -Dcom.sun.management....

    jconsole通过JMXMP协议连接的jar文件

    jconsole连接JMX在很多例子中采用RMI协议连接。 但是在实际生产环境下,RMI会受到来自防火墙的诸多限制,经常连接不上。 采用JMXMP协议是一个替换办法。 将解压后的几个jar全部拷贝到服务器端%JAVA_HOME%\jre\lib\...

    jmx一步步来 jmx快速上手指南

    jmx快速上手 jmx快速上手 jmx快速上手 jmx快速上手

    jmx入门

    为什么JMX那么受欢迎,JMX到底有那些优势只得人们去学习和理解,本文从JMX的基本架构、hellowold jmx以及spring对JMX的支持讲起,希望大家能通过本文对JMX有个基础的认识,并能通过本文为今后学习JMX打个基础

    Fiddler导出jmx文件

    Fiddler导出jmx文件,解决Fiddler导出文件中 没有jmx文件选项,各个版本fiddler都适用

    jmx-tools.zip

    jmx页面展示工具调用HtmlAdaptorServer

    亲测可用 com.sun.jmx. jmxri-1.2.1.jar

    Description Resource Path Location Type Missing artifact com.sun.jmx:jmxri:jar:1.2.1 pom.xml /eshop-storm line 2 Maven Dependency Problem

    fiddler导出jmx文件方案.zip

    通过把通过fiddler抓取的请求数据导出为jmx文件类型,然后把这个文件导入到jmeter中运行,从而实现两者的互通

    jmx三种访问方式

    Jmx简单应用,http页面方式,vm参数方式,rmi方式

    JAVA RMI 传输 SSL加密

    我最近在研究JMX,底层通过RMI传输,为了数据安全,需要SSL加密.我成功试验了本地及远程的传输方法.希望对大家有些帮助.

    jmx-jvm配置

    jmx配置

    完美解决jmx中的HtmlAdaptorServer找不到的问题

    完美解决jmx中的HtmlAdaptorServer找不到的问题,完美解决jmx中的HtmlAdaptorServer找不到的问题,

    JBoss JMX实现架构

    JBoss JMX实现架构 JBoss JMX实现架构

Global site tag (gtag.js) - Google Analytics