JMX架构简介

JMX简单介绍

Java管理扩展JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。
JMX是一种应用编程接口,可扩充对象和方法的集合体,可以用于跨越一系列不同的异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用它提供了用户界面指导、Java类和开发集成系统、网络及网络管理应用的规范。

管理对象是JMX应用程序的核心。JMX结构包括:支持Java的Web浏览器用户接口,管理运行模块ARM(Admin Runtime Module)和应用。这三个部件之间通过RMI(Remote Method Invocation)进行通信。这里需要说明的是,RMI是使得一个Java虚拟机(JVM)上运行的程序可以调用远程服务器上另一个JVM总的对象。

Java管理扩展JMX的体系结构

JMX框架如下图所示:

CIlaw2Y.png

设备层(Instrumentation Level)

主要定义了信息模型。在JMX中,各种管理对象以管理构件的形式存在,需要管理时,向MBean服务器进行注册。该层还定义了通知机制以及一些辅助元数据类。

设备层其实就是和被管设备通信的模块,对于上层的管理者来说,Instrumentation 就是设备,具体设备如何通信,是采用SNMP,还是采用ICMP,是MBean的事情。在网管系统中,把系统的各种服务,例如拓扑发现,用户管理等等都作为一个MBean,作为一个被管理的单元。

该层定义了如何实现JMX管理资源的规范。一个JMX管理资源可以是一个Java应用、一个服务或一个设备,它们可以用Java开发,或者至少能用Java进行包装,并且能被置入JMX框架中,从而成为JMX的一个管理构件(Managed Bean),简称MBean。管理构件可以是标准的,也可以是动态的,标准的管理构件遵从JavaBeans构件的设计模式;动态的管理构件遵从特定的接口,提供了更大的灵活性。感觉管理构件应该翻译为被管理构件才好。该层还定义了通知机制以及实现管理构件的辅助元数据类(元数据类就是构成一个MBean的各种元素:属性、方法等等)。

在JMX规范中,管理构件定义如下:它是一个能代表管理资源的Java对象,遵从一定的设计模式,还需实现该规范定义的特定的接口。该定义了保证了所有的管理构件以一种标准的方式来表示被管理资源。
管理接口就是被管理资源暴露出的一些信息,通过对这些信息的修改就能控制被管理资源。一个管理构件的管理接口包括:

  • 能被接触的属性值;
  • 能够执行的操作;
  • 能发出的通知事件;
  • 管理构件的构建器。

管理构件通过公共的方法以及遵从特定的设计模式封装了属性和操作,以便暴露给管理应用程序。例如,一个只读属性在管理构件中只有Get方法,既有Get又有Set方法表示是一个可读写的属性。
其余的JMX的构件,例如JMX代理提供的各种服务,也是作为一个管理构件注册到代理中才能提供相应的服务。

JMX对管理构件的存储位置没有任何限制,管理构件可以存储在运行JMX代理的Java虚拟机的类路径的任何位置,也可以从网络上的任何位置导入。

JMX定义了四种管理构件(MBean):标准、动态、开放和模型管理构件。每一种管理构件可以根据不同的环境需要进行制定。

标准管理构件

标准管理构件的设计和实现是最简单的,它们的管理接口通过方法名来描述。标准管理构件的实现依靠一组命名规则,称之为设计模式。这些命名规则定义了属性和操作。

检查标准管理构件接口和应用设计模式的过程被称为内省(Introspection)。JMX代理通过内省来查看每一个注册在MBean 服务器上的管理构件的方法和超类,看它是否遵从一定设计模式,决定它是否代表了一个管理构件,并辨认出它的属性和操作。

动态管理构件

动态管理构件提供了更大的灵活性,它可以在运行期暴露自己的管理接口。它的实现是通过实现一个特定的接口DynamicMBean。

JMX代理通过getMBeanInfo方法来获取该动态管理构件暴露的管理接口,该方法返回的对象是MbeanInfo类的实例,包含了属性和操作的签名。由于该方法的调用是发生在动态管理构件向MBean服务器注册以后,因此管理接口是在运行期获取的。不同于标准管理构件,JMX代理不需要通过内省机制来确定动态管理构件的管理接口。由于DynamicMBean的接口是不变的,因此可以屏蔽实现细节。由于这种在运行期获取管理接口的特性,动态管理构件提供了更大的灵活性。

开放管理构件

开放管理构件是一种专门化的动态管理构件,其中所有的与该管理构件相关的参数、返回类型和属性都围绕一组预定义的数据类型(String、Integer、Float 等)来建立,并且通过一组特定的接口来进行自我描述。JMX代理通过获得一个OpenMBeanInfo对象来获取开放管理构件的管理接口,OpenMBeanInfo是MbeanInfo的子类。

模型管理构件

模型管理构件也是一种专门化的动态管理构件。它是预制的、通用的和动态的 MBean 类,已经包含了所有必要缺省行为的实现,并允许在运行时添加或覆盖需要定制的那些实现。JMX规范规定该类必须实现为javax.management.modelmbean.RequiredModelMBean,管理者要做的就是实例化该类,并配置该构件的默认行为并注册到JMX代理中,即可实现对资源的管理。JMX代理通过获得一个ModelMBeanInfo对象来获取管理接口。

模型管理构件具有以下新的特点:

  • 持久性:定义了持久机制,可以利用Java的序列化或JDBC来存储模型MBean的状态。 就是要保存到硬盘上。
  • 通知和日志功能:能记录每一个发出的通知,并能自动发出属性变化通知。
  • 属性值缓存:具有缓存属性值的能力。

通知模型

一个管理构件提供的管理接口允许代理对其管理资源进行控制和配置。然而,对管理复杂的分布式系统来说,这些接口只是提供了一部分功能。通常,管理应用程序需要对状态变化或者当特别情况发生变化时作出反映。

为此,JMX定义了通知模型。通知模型仅仅涉及了在同一个JMX代理中的管理构件之间的事件传播。JMX通知模型依靠以下几个部分:

  • Notification,一个通用的事件类型,该类标识事件的类型,可以被直接使用,也可以根据传递的事件的需要而被扩展。
  • NotificationListener接口,接受通知的对象需实现此接口。
  • NotificationFilter接口,作为通知过滤器的对象需实现此接口,为通知监听者提供了一个过滤通知的过滤器。
  • NotificationBroadcaster接口,通知发送者需实现此接口,该接口允许希望得到通知的监听者注册。
    发送一个通用类型的通知,任何一个监听者都会得到该通知。因此,监听者需提供过滤器来选择所需要接受的通知。

任何类型的管理构件,标准的或动态的,都可以作为一个通知发送者,也可以作为一个通知监听者,或两者都是。

辅助元数据

辅助元数据类用来描述管理构件。辅助元数据类不仅被用来内省标准管理构件,也被动态管理构件用来进行自我描述。这些类根据属性、操作、构建器和通告描述了管理接口。JMX代理通过这些元数据类管理所有管理构件,而不管这些管理构件的类型。
部分辅助元类如下:

  • MBeanInfo:包含了属性、操作、构建器和通知的信息。
  • MBeanFeatureInfo:为下面类的超类。
  • MBeanAttributeInfo:用来描述管理构件中的属性。
  • MBeanConstructorInfo:用来描述管理构件中的构建器。
  • MBeanOperationInfo:用来描述管理构件中的操作。
  • MBeanParameterInfo:用来描述管理构件操作或构建器的参数。
  • MBeanNotificationInfo:用来描述管理构件发出的通知。

代理层(Agent Level)

这里首先要理解的Agent和SNMP中的Agent不一样,SNMP中的Agent是设备上的一个程序,可以理解为被管理的设备。而JMX中的Agent并不是被管理的设备,而是进行管理设备(设备就是MBean)的一个程序,它对于JMX的上层来说,是一个被管理设备,针对下面的具体设备来说,它又是一个管理者。其实也就是MBeanServer。

主要定义了各种服务以及通信模型。该层的核心是一个MBean服务器,所有的管理构件都需要向它注册,才能被管理。注册在MBean服务器上管理构件并不直接和远程应用程序进行通信,它们通过协议适配器和连接器进行通信。而协议适配器和连接器也以管理构件的形式向MBean服务器注册才能提供相应的服务。这段话比较模糊,其实管理构件就是MBean,也可以看作是被管理的设备,其中说的管理构件并不和远程应用程序进行通信,就是说被管理的MBean不和控制台,也就是前台控制程序(web、服务器等)通信。

代理层是一个运行在Java虚拟机上的管理实体,它活跃在管理资源和管理者之间,用来直接管理资源,并使这些资源可以被远程的管理程序所控制。代理层由一个MBean服务器和一系列处理被管理资源的服务所组成。

MBean服务器

Mbean服务器为代理层的核心,设备层的所有管理构件都在其注册,管理者只用通过它才能访问管理构件。
管理构件可以通过以下三种方法实例化和注册:

  1. 通过另一个管理构件
  2. 管理代理本身
  3. 远程应用程序

注册一个管理构件时,必须提供一个唯一的对象名。管理应用程序用这个对象名进行标识管理构件并对其操作。这些操作包括:

  1. 发现管理构件的管理接口
  2. 读写属性值
  3. 执行管理构件中定义的操作
  4. 获得管理构件发出的通告
  5. 基于对象名和属性值来查询管理构件

协议适配器和连接器

MBean服务器依赖于协议适配器和连接器来和运行该代理的Java虚拟机之外的管理应用程序进行通信。协议适配器通过特定的协议提供了一张注册在MBean服务器的管理构件的视图。例如,一个HTML适配器可以将所有注册过的管理构件显示在Web 页面上。不同的协议,提供不同的视图。

连接器还必须提供管理应用一方的接口以使代理和管理应用程序进行通信,即针对不同的协议,连接器必须提供同样的远程接口来封装通信过程。当远程应用程序使用这个接口时,就可以通过网络透明的和代理进行交互,而忽略协议本身。

适配器和连接器使MBean服务器与管理应用程序能进行通信。因此,一个代理要被管理,它必须提供至少一个协议适配器或者连接器。面临多种管理应用时,代理可以包含各种不同的协议适配器和连接器。

当前已经实现和将要实现的协议适配器和连接器包括:

  • RMI连接器
  • SNMP协议适配器
  • IIOP协议适配器
  • HTML协议适配器
  • HTTP连接器

分布服务层(Distributed Service Level)

主要定义了能对代理层进行操作的管理接口和构件,这样管理者就可以操作代理。然而,当前的JMX规范并没有给出这一层的具体规范。

附加管理协议API

定义的API主要用来支持当前已经存在的网络管理协议,如SNMP、TMN、CIM/WBEM等。

JMX架构的使用场景及优点

JMX应该说是关于网络应用管理的的框架,如果你开发了一个比较复杂的系统,无疑你要提供这个系统的自身管理 系统,JMX更多应用是体现在Server上,如果你要使用java开发一个自己Server或复杂的应用系统,那么推荐你基于JMX架构来开发, JBoss 3.0 weblogic等就是基于JMX开发的符合J2EE规范的服务器软件。

了解JMX可以使你深入了解J2EE服务器, 为什么我们平时说 “EJB”是个比较”Weight”的方案选择,其中一个原因是J2EE服务器软件本身 也是你的系统中一部分,它作为你系统的容器,对你的系统有至关重要的作用,如果无法直接介入 管理或“调教”它,那么无疑你的系统本身存在着隐含的危险, 现在,通过JMX,你现在可以深入到你J2EE容器内部的管理了。 (好像国内出现了第一个自己J2ee服务器,不知道那是不是基于JMX开发的?)

J2EE并不能概括所有的应用领域,比如对速度和性能要求极高的游戏或股票行情等系统就需要自己直接来开发Server, 如果是能够基于JMX开发,那么可以说就大大提高编写管理程序的效率,可以将你的模块变成JMX的MBean,可以通过Agent在程序内部或者通过 WEB管理页面对你的MBean模块进行初始化 重启 以及参数设置。

JMX的好处还有:可以方便整合连接现有的Java技术,如JNDI、 JDBC 、JTS及其它。特别是能够使用Jini的查询 发现机制以及协议,我们知道,Jini提供了一种服务的查询和发现机制,这些services都可以通过JMX 来实现管理。


原文链接:http://blog.csdn.net/drykilllogic/article/details/38379623