JMX学习-设备层
1.JMX:网络管理规范
JMX(Java Management Extension Instrumentation and Agent Specification) 是业界广泛合作创建一套规范的成果,它描述可扩展的体系结构、API 和一组使用 Java 编程语言用于网络管理的分布式服务,它利用了 Java 平台的网络管理能力。最新的规范是 1.4。
2.JMX 的体系结构和操作模型
JMX 的体系结构和操作模型旨在满足下列目标:
•可伸缩性:适应从管理少数设备或服务到管理因特网时代的企业可能拥有的数万个可管理端点的能力
•旧系统集成和兼容性:与现有 NMS 或 EMS 解决方案以及与可能不支持 JMX 的旧的可管理端点协作的能力
•低成本实现:无需大量设计和编码工作,即可轻松地将 JMX 兼容性设计到现有软件产品和设备中
在 JMX 体系结构中,采用三级分而治之的体系结构化方法来降低可伸缩网络管理的复杂性。
图1说明了这三个松散耦合的层。它们是:
•设备层(Instrumentation Level) 设备层的主要任务就是对资源进行封装,使之成为可管理资源。所谓封装,就是通过将资源用类似Java Bean的方式描述出来。当资源以这种方式被封装成为可管理资源后,就被称作MBean(Management Bean)。
•代理层(Agent Level) 代理层位于装配层和分布式服务层之间,包含 MBean服务器,代理服务,连接器和协议适配器。代理层的作用体现在内外两方面:对内它通过MBean服务器(Managed Bean Server)维护着MBean的生命周期(包括注册和注销MBean),同时为所注册的MBean提供各类服务;对外通过连接器和协议适配器将已注册的MBean的管理接口暴露给外面的管理应用使用。
•分布式服务层(Distributed Service Level) 分布式服务层驻留着管理应用。管理应用通过连接器(Connector)与MBean服务器建立连接,并通过管理接口(Management Interface)去访问各个Mbean所包装的可管理资源。JMX Remote API Specification(JSR-166)对分布式服务层的应用给出了具体的规范。
图 1. JMX 体系结构的三层
3.设备层
该层定义了如何实现JMX管理资源的规范。一个JMX管理资源可以是一个Java应用、一个服务或一个设备,它们可以用Java开发,或者至少能用Java进行包装,并且能被置入JMX框架中,从而成为JMX的一个管理构件(Managed Bean),简称MBean。
管理构件可以是标准的,也可以是动态的,标准的管理构件遵从JavaBeans构件的设计模式;动态的管理构件遵从特定的接口,提供了更大的灵活性。
该层还定义了通知机制以及实现管理构件的辅助元数据类。
4.MBean组件
MBean是Management Bean的缩写,负责将可管理资源和服务封装成类似Java Bean的形式。通过MBean的特性可以访问可管理资源的各类信息。MBean对资源的封装体现在以下几个方面:
说明:JVM已经默认被封装成可管理对象。可通过它去访问内置的JVM,从而远程监控并管理JVM。
MBean在JMX的3层架构中位于设备层和代理层,这两层中的MBean有着不同的作用:位于设备层的MBean被用来封装可管理资源,而位于代理层的MBean被用来封装MBean服务器提供的代理服务(比如定时器服务和监视器服务)。
从MBean的实现上来看,MBean分为两种类型:标准(Standard)MBean和动态(Dynamic) MBean。其中动态MBean又进一步分为Open MBean和Model MBean,如图2所示。
图2. MBean的分类
a)标准(Standard)MBean
标准MBean适用于描述那些数据稳定且可被事先准确定义的资源。标准MBean就是一个普通Java Bean,MBean服务器通过Java的内省(Introspection)机制来获知标准MBean的属性、事件和方法,只是这里内省所遵循的命名规定是JMX特有的命名约定。
这种类型的MBean最简单,它能管理的资源(包括属性,方法,时间)必须定义在接口中,然后MBean必须实现这个接口。而且这个MBean实现类中,必须至少有一个public的构造函数。 类中的getter和setter函数必须遵守命名标准。 类的命名也必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean,而且是大小写敏感的。如果不这么做,可能会有javax.management.NotCompliantMBeanException抛出。
b)动态(Dynamic)MBean
动态MBean适用于描述那些要在运行时才可确切知道的数据结构的资源。与标准 MBean不同的是,动态MBean所暴露的管理接口不必事先确定,而是可根据运行时的情况,判断生成最终的管理接口。比如用以描述配置的MBean,可能需要通过对配置文件的分析来最终获得属性的名称和类型。
动态MBean的标志是实现了javax.manangement.DynamicBean接口。接口中的方法getMBeanInfo()所返回的就是要对外发布的管理接口。与标准MBean不一样的是,MBean服务器不是通过内省,而是通过getMBeanInfo()方法的返回值来获取动态Bean的管理接口。
当在JMX agent里注册时候, dynamic MBean和standard MBean是同样被对待的。管理程序首先通过getMBeanInfo函数获得管理接口,得到属性和方法的名称.然后程序可以调用getters,setters和invoke方法.
c)开放(Open)MBean
Open MBean是一类特殊的动态Mbean,它的特征是只针对特定对象,比如原始的数据类型(如int和float)和复合的数据类型。
开发standard,dynamic和model MBean可以使用复杂类型。然而,为了让管理程序能够正确得到这些类型的状态,这些类的字节码必须让这些管理程序访问到。结果就是导致管理程序和被管理资源的耦合度很高。折衷的做法,就是要降低被管理的资源的可维护性。Open MBean的产生就是为了去掉这个需求。采用的方法是,Open MBean使用通用的数据类型。
管理程序和Open MBeans就可以共享和使用数据和方法,而不需要重新编译,重新组配或者动态链接。所以说,Open MBeans提高了管理系统的灵活性和可扩展性。
当管理程序无法访问agent的java classes的时候,就特别有用。即使管理程序和agent之间的连接不支持java序列化的时候,也是可以访问Open MBeans的。比如说,管理程序不是java开发的。
d)模型(Model)MBean
与标准和动态MBean相比,你可以不用写MBean类,只需使用javax.management.modelmbean.RequiredModelMBean即可。RequiredModelMBean实现了ModelMBean接口,而ModelMBean扩展了DynamicMBean接口,因此与DynamicMBean相似,Model MBean的管理资源也是在运行时定义的。与DynamicMBean不同的是,DynamicMBean管理的资源一般定义在DynamicMBean中(运行时才决定管理那些资源),而model MBean管理的资源并不在MBean中,而是在外部(通常是一个类),只有在运行时,才通过set方法将其加入到model MBean中。Model MBean可以在MBean server中进行实例化,而且用户可以配置它来管理任何资源。
Model MBean可以被任何JMX兼容的agent来创建, 这是个很大的优势. 有很多特性:
- 持久化
这个持久化机制实现是在sun的参考实现中提供的, 通过java的对象序列化功能来把当前ModelMBeanInfo对象的状态写到一个文件中的. 当然其他比如jdbc的持久化机制也是可以实现的.
- 通知记录 Notification logging
- 属性值缓存
比如说,策略可以这样规定,当一个属性第一次被获取的时候,可以保存在本地,下一次的访问需求可以用本地的缓存来满足. 本地的缓存值多长时间被重新更新,这个间隔时间是缓存策略规定, 用户可以来设置。
这个能力极大提高了程序的性能. 例如,Model MBean如果管理的是一个远程资源,它就可以把属性值保存在本地,这样就避免了重复地进行远程调用来获取属性的值.
- 操作代理
- 一般通知
Model MBean提供方法来发出一般的纯信息的通知.
5.JMX消息模型
Notification(消息)被用来特指JMX 应用中的事件。JMX消息模型所描述的是MBean之间交换信息的机制。JMX消息模型包括消息播发器、JMX消息、侦听器(Listener)和过滤器等对象。JMX消息经过过滤器的筛选,由消息播发器发送给消息侦听器。JMX消息模型如图3所示。
消息播发器和侦听器可以是任意对象,只要它们实现了相应的接口,MBean和MBean服务器都可以充当消息播发器或侦听器的角色。侦听器需支持NotificationListener接口,这个接口定义了事件被触发时侦听器所要完成的操作。消息播发器则要求维护一个所要通知的消息侦听器的列表,它通常实现了接口 NotificationBroadcaster或NotificationEmitter。过滤器须实现NotificationFilter 接口,并通过实现接口中的方法isNotificationEnabled(Notification notification)来决定过滤哪些消息。
图3 JMX消息模型
JMX消息是Notification类或其子类的实例,它封装了播发器所要通知侦听器的内容和相关信息,参见表1。
MBeanServerNotification:MBeanServer用于通知MBean的监听程序进行注册或取消注册。
属 性 |
说 明 |
Source |
消息播发器的实例引用 |
message |
对Notification的说明 |
SequenceNumber |
Notification实例的唯一标识 |
TimeStamp |
时间戳。Notification何时生成 |
Type |
用点标注法表示的JMX消息类型。比如JMX.MBean.registered |
UserData |
具体的要传达的信息 |