一、JMX的一些定义与用途
Java Management Extensions:Java管理扩展,是管理系统和资源之间的一个接口,它定义了管理系统和资源之间交互的标准。
1、专门管理,监控jvm的一些信息的,特别是visual vm这个监控jvm的东西,还有一个添加JMX连接的时候
2、能使得基于java语言开发的程序能被管理,并且是可扩展的。
3、用jmx把需要配置的属性集中在一个类中,然后写一个MBean,再进行相关配置。另外JMX还提供了一个工具页,以方便我们对参数值进行修改。
4、让开发者和管理者可以获取程序运行的状态以及动态的修改程序的相关配置。
程序开启JMX功能可以监控程序的资源使用情况,因为JDK自带了关于程序资源情况的MBean工具类
我们可以使用类似的设计模式,对我们程序中的资源进行 监控和控制
二、JMX入门
先了解基本的专业术语:
1、MBean:是Managed Bean的简称,在JMX中MBean代表一个被管理的资源实例,通过MBean暴露一系列的方法和属性,外界可以获取被管理的资源的状态和操纵MBean的行为。事实上,MBean就是一个Java Object。同javabean模型一样,外界使用反射获取Object的值和调用Object的方法,只是MBean提供了更加容易操作的反射的使用。MBean包括4种类型:标准MBean、动态MBean,开放MBean,模型MBean。
2、MBeanServer:MBeanServer是MBean的容器。MBeanServer管理这些MBean,并且通过代理外界对它们的访问。MBeanServer提供了一种注册机制,通过注册Adaptor和Connector,以及MBean到MBeanServer,并且通过代理外界对它们的访问,外界可以通过名字来得到相应的MBean实例。
3、JMX Agent:Agent只是一个java进程,它包括这个MBeanServer和一系列附加的MBeanService。当然这些Service也是通过MBean的形式来发布。
4、Protocol Adaptors and Connectors:JMX Agent通过各种各样的Adaptor 和Connector来与外界(JVM之外)进行通信。同样外界(JVM之外)也必须通过某个Adaptor和Connector向来JMX Agent发送管理或控制请求。jdk5.1中,sun提供很多Adaptor和Connector的实现。
Adaptor 和Connector·的区别在于:Adaptor是使用某种协议(Http和SNMP)来与JMX Agent获得联系,Agent端会有一个对象(Adaptor)来处理有关协议的细节。比如SNMP Adaptor·和HTTP Adapter.而Connector·在Agent端和client端都必须有这样一个对象来处理响应的请求和应答。比如RMI Connector·。
JMX Agent可以带有任意多个Adaptor·,因此可以使用多种不同的方式访问Agent。
JMX基本构架:JMX分为三层,分别负责处理不同的事务。它们分别是:
1、Instrumention层:Instrumention 层主要包括了一系列的接口定义和描述如何开发MBean的规范。通常JMX所管理的资源有一个或多个MBean组成,因此这个资源可以是任何由Java语言开发的组件,或是一个JavaWrapper包装的其他语言开发的资源。
2、Agent层:Agent用来管理相应的资源,并且为远端用户提供访问的接口。Agent层构建在Intrumentation层之上,并且使用管理Instrumentation层内部的组件。通常Agent由一个MBeanServer组成。另外Agent还提供一个或多个Adapter或Connector以供外界的访问。
3、Distributed层:Distributed层关心Agent如何被远端用户访问的细节。它定义了一系列用来访问Agent的接口和组件,包括Adapter和Connector的描述。
三、应用场景
1、中间件软件weblogic的管理页面就是基于JMX开发的。
2、hibernate号称实现了JMX规范,将可管理,可调用的MBean注册到MBeanServer中,通过一种类似web服务的方式公布出去,并且伴有一个名字,可以通过该名字找到该MBean,并且,这里的MBean是可以被管理的。
3、Tomcat的自带应用manager就是使用了JMX方式来管理Tomcat。以此完成我web应用的动态部署、启动、停止。
4、JBoss则整个系统都基于JMX架构,使用JMX治理内部的各个service。
5、基于java的开源网管软件Hyperic HQ,通过JMX与各被治理资源进行通讯和信息采集。
JMX是一个治理的框架
当我们想使用JMX的时候,就要问,我们的系统当中有需要监控治理的资源或者对象吗?实事求是一点,我们不能为了想使用一个高端的技术,就歪曲系统的本来面目。
假如肯定要用,接着就看这些资源是否有生命周期。
经典案例:JBoss就是将所有可部署的组件作为资源来治理,这些组件都有生命周期。这个理念甚至延伸到了其系统内部,将其内部的服务作为组件纳入到JMX中来,成就了JBoss基于JMX的微内核系统。
典型的应用场景:
一个系统中,个内部模块系统之间的,基于接口方式的互相调用和治理,使用JMX是最佳方案。。带来的好处是:
1、面向接口,远程调用对于开发人员是透明的,模块在调用JMX接口时,与调用本地方法几乎相同。
2、可视化的治理界面,通过Jconsole等JMX客户端。可以实时监控系统,并且可实时调用方法进行某些操作。
四、JMX与Web Service
1、个人认为,我们实现JMX规范,将东西发布出去,和通过Web service的方式是很类似的,也是可以远程调用的,只是相对的web service的方式更加SOA一些。
2、从这里,我觉得JMX可以实现的,我们也都可以通过web service实现,只是看在它有个M上,以后如果有什么系统管理,监控方面的,可以考虑使用它,也许开发,个人觉得还是使用web service好一些。
3、选择webservice,xmlrpc等,但是这些都需要手工编写或用工具生成大量的代码来辅助完成接口间的java对象序列化。
五、现在的JMX连接方式
提供了三种Connector:RMI Connector / JMXMP Connector(JMX message protocol Connector) / Jolokia
1、RMI Connector 用JAVA的RMI功能来实现,可以在本地调用接口对象,这个不多说,因为只能是JAVA客户端使用,实现不了异构系统。
2、JMXMP Connector 就是使用协议在通讯了,Java也有实现这种连接的API,其他语言肯定也有的,这个能实现异构系统调用,是RMC模式。
3、Jolokia is a JMX-HTTP bridge giving an alternative method of accessing JMX beans,can be accessed using /jolokia on your management HTTP server.
实现原理
从Java 5开始,JDK就是提供非常有名的java.lang.management包,包里提供了许多MXBean的接口类,开发者可以很方便的获取到JVM的内存,GC,线程,锁,class,甚至操作系统层面的各种信息。我们可以 遍历程序所有的MBean查看。