`
m635674608
  • 浏览: 5041270 次
  • 性别: 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"); 这个有效,我的问题就是在这,加上就可以了

相关推荐

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

    在Java世界中,远程方法调用(Remote Method Invocation, RMI)和Java管理扩展(Java Management Extensions, JMX)是两个强大的工具,用于管理和监控分布式系统。本文将深入探讨如何利用RMI远程连接到Java虚拟机...

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

    JMX以RMI方式连接的场景示例 JMX(Java Management Extensions)是一种Java技术,用于管理和监控应用程序。JMX框架主要由三部分组成:MBean(Managed Bean)、Agent(代理)和Client(客户端)。在本场景中,我们将...

    jmx三种访问方式

    通过设置`-Dcom.sun.management.jmxremote.rmi.port`和`-Dcom.sun.management.jmxremote.port`等参数,可以启用RMI服务,允许远程客户端连接到JMX服务器。 2. **自定义JMX客户端**:开发者可以编写自己的JMX客户端...

    jmx 实例 rmi mbean

    在本实例中,我们重点关注的是如何使用Remote Method Invocation(RMI)来实现JMX的MBean管理。RMI是一种在Java平台上进行远程调用的技术,使得一个Java对象的方法可以在不同的Java虚拟机(JVM)之间被调用。结合JMX...

    TongWeb7的JMX监控.doc

    在运维过程中,JMX(Java Management Extensions)监控是一个非常重要的工具,可以帮助我们实时查看和管理应用程序的状态,以及诊断和解决问题。本文将详细介绍如何使用 JMX 监控 TongWeb7。 首先,要开启 JMX 监控...

    jmx-tools.zip

    3. `jmxri.jar`和`jmxtools.jar`:这两个JAR文件是JMX RMI实现的核心库,分别包含了RMI服务器和客户端的实现,使得远程JMX交互成为可能。 4. `jmxri.properties`和`jmxtools.properties`:这些配置文件可能包含了...

    JMX官方文档 - 概览,入门,规范

    它们定义了客户端和服务器之间的通信协议,如JMX RMI连接器和JMX JMXMP连接器。连接器提供了安全机制,确保只有授权的客户端才能访问MBean服务器。 五、JMX工具和API 1. JMX API:包括MBean服务器接口、MBean接口...

    jboss远程调用JMX

    这个文件可能实现了将JMX服务暴露为RMI服务的功能,使得远程客户端可以通过RMI URL连接到JMX服务器。RMI URL通常类似于`service:jmx:rmi:///jndi/rmi://hostname:port/jmxrmi`,其中`hostname`和`port`是JBoss服务器...

    jmx监控activeMQ监控

    通过jmx监控,可以快速地检测和解决ActiveMQ中的问题,从而提高系统的可靠性和稳定性。 在生产环境中,jmx监控是非常重要的,可以帮助开发者和运维人员实时监控ActiveMQ的运行状态,快速检测和解决问题。同时,jmx...

    cmdline-jmxclient-0.10.3.jar

    - **JMX Connectors**:提供了客户端与MBean Server之间的通信协议,如RMI/JRMP和JMXMP。 - **JMX URL**:用于指定连接到MBean Server的格式,如`service:jmx:rmi:///jndi/rmi://hostname:port/jmxrmi`。 总的来说...

    JMX一步一步来,快速学会开发JMX应用

    - **Connector**:提供客户端与MBeanServer之间的通信,例如RMI、JMXMP等。 在HelloWorld实例中,Hello类就是一个简单的MBean,提供了获取和设置名字的功能。MBeanServer可以将Hello对象注册进去,然后通过JMX...

    JMX配置与使用

    - `service:jmx:rmi:///jndi/rmi://&lt;hostname&gt;:&lt;port&gt;/jmxrmi`:JMX RMI URL,其中`hostname`和`port`对应服务器的配置。 - 如果启用了认证,还需要提供用户名和密码。 ### JMX的应用场景 JMX广泛应用于各种场景,...

    java jmx agent不安全的配置漏洞如何改进(由浅入深代码范例和详细说明).docx

    JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi"); // 创建 RMI 连接器 JMXConnectorServer connector = JMXConnectorServerFactory.newJMXConnectorServer(url, ...

    JMX、MXBean学习

    4. **JMX连接器**:JMX提供了多种连接器,如RMI、HTTP、JMXMP等,允许远程客户端与MBean服务器通信。 5. **管理工具**:例如JConsole、VisualVM等,它们是JMX的标准客户端,可以帮助开发者可视化和交互式管理Java...

    JAVA JMX 学习资料

    JMX Connectors提供了连接到MBean Server的途径,有多种类型的连接器,如RMI(Remote Method Invocation)和JMXMP(JMX Message Protocol),用于远程管理。 6. **JConsole**: Java自带的JConsole是JMX的一个...

    JMX HelloWorld Download

    **标题解析:** "JMX HelloWorld Download" 指的是一个关于Java Management Extensions(JMX)的简单示例,可能是用于教学或演示如何在Java应用中使用JMX技术。"Download"表明这是一个可以下载的资源,可能包含了...

    jmx-1_2_1-ri.zip jmx_remote-1_0_1_03-ri.zip jmx-1_1-mr-spec.zip

    - **MBean Server Connector**:MBean Server Connector允许外部应用程序通过特定的协议(如RMI、HTTP、JMXMP等)与MBean Server通信,实现远程管理。 - **Notification**:MBeans可以发送通知,用来告知管理者资源...

    jmxdemo.rar

    这通常涉及到查找并实例化适当的MBean服务器连接器,如JMXMP(JMX Message Protocol),RMI-JRMPI(Remote Method Invocation with Java Remote Management Interface)等,然后使用连接器连接到服务端。 VisualVM...

    jmx学习资料

    5. **JMX Connectors**: 这是JMX与外部世界的桥梁,提供了多种标准的协议和API,如RMI、HTTP、JMXMP等,使得远程管理成为可能。 **JMX的实际应用** 1. **监控Java应用**: 通过JMX,开发者可以创建自定义的监控指标...

Global site tag (gtag.js) - Google Analytics