本节讲解JMX的技术架构, JMX技术可以被分为3层,如下:
* 监测(Instrumentation)
* JMX代理
* 远程管理
如下图:
乍一看这张图,读者可能会比较晕,不过没关系,下文将会详细的解释。我们从最下面的一层Instrumentation Level(监控层)开始讲解。
监测(Instrumentation)
回顾上一节,我们使用JMX可以监控服务器内存、CPU,可以监控JVM的堆内存、线程数等指标。监控的含义就体现在这,我们可以使用JMX来监控任何我们关心的性能指标。
Oracle官方文档将监控各项指标称之为“监控资源”,个人认为,用“监控指标”可能更具有说服力。所以后文在提到“监控指标”或者“监控资源”的时候,其实都是一个含义。 以下为JMX官方文档关于监控的讲解的中文翻译:
“要想利用JMX技术来管理资源,你首先必须用Java编程语言来监测(instrument)该资源。你使用叫做MBeans的Java对象来实现对该资源的监测信息的访问。”
翻译成大白话就是:
我们对关心的各项性能指标的监控,都是通过称之为MBean的Java对象来实现的。我们可以用一个MBean来监控操作系统的基本信息,用一个MBean来监控JVM的信息,用一个MBean监控应用程序....。
总结:监控层的作用就是使用MBean来监控我们关心的性能指标。因为我们通常关注的性能指标比较多,通常情况下,在监控层我们会有多个MBean,每个MBean监控一类信息。
JMX Agent(代理)
我们已经知道,在监控层通常会有很多的MBean,用于监控不同的指标。一旦一个资源被MBeans监测,就可以通过一个JMX代理来管理它。
那么JMX代理是什么呢?
你可以将JMX代理想象成一个容器,所有的MBean都注册到这个容器中。这个容器可以接受外部的请求,返回MBean的监控信息。当我们想从远程获取某个MBean的检测信息,我们就给这个容器发送一个请求,由这个容器将这个MBean的检测信息返回给我们。
这很像一个Web服务器的作用,通常一个Web服务器中可以有多个Servlet,我们想请求某个Servlet时,只要指定URL,由WEB服务器来调用对应的Servlet方法,并将结果返回。所不同的是,JMX代理是内嵌在我们的Java应用程序中的,而不是像Tomcat这样的Web容器,单独起一个JVM进程来运行。
以下还是官方的一段介绍:
MBeans不需要知道它们将要操作的JMX代理的信息。
MBeans设计目标为灵活、简单并方便实现。应用程序、系统和网络开发者可以以标准的方式让其产品成为可管理的产品,而不必理解或投资复杂的管理系统。可以以很小的代价将已有的资源改造成可管理的。
这段话,同样可以类比Web容器进行理解:我们写的Sevlet可以运行在Tomcat中,也可以运行在其他的Web容器中,如Jetty、Weblogic等。这些Web容器的实现方式可能不同,但是我们的Servlet都可以运行,因为这些WEB容器都实现了Servlet规范。对于JMX而言,而在不同版本JDK中,可能JMX代理的实现方式有所不同,但是只要其实现了JMX规范,我们的MBean都可以运行。
容器的作用,只是JMX代理最为核心的功能。在JMX中,我们将这种容器称之为MBean Server。
JMX Agent的核心组件是MBean server,它是一个被管理对象的服务器,MBeans在其中注册。一个JMX代理还包括一组用于管理MBeans的服务和至少一个通信适配器(adaptor)或连接器(connector) 以供管理程序访问。
如果对比WEB容器的作用的话,相信这段话你也很容易就理解了。
最后再来一段废话,当然这段废话不是我说的,能说出这种废话的,当然是官方文档:
当你实现一个JMX代理的时候,你不需要知道它将会管理的资源的语义和功能。实际上,JMX Agent甚至不需要知道它将会服务哪些资源,因为任何资源,只要其监测兼容JMX规范,就能够使用任何JMX Agent为这些资源提供它们所需要的服务。类似地,JMX代理不需要知道将要访问它的管理程序的功能。
还是类比WEB容器,一个WEB容器可以运行不同功能的应用,你可以在上面跑一个电商网站,也可以是一个博客系统。对于JMX而言,不管你写什么MBean,来监控什么指标, 反正JMX代理上都能跑。
远程管理(adaptors/connectors client)
通常情况下,我们会用使用一个远程客户端连接MBean Server来获取MBean的监控信息。道理很简单,方便查看和管理。一方面,通过远程客户端,我们可以更好的查看检测到的信息,例如将监控信息在浏览器中展现出来,甚至可以做图表进行展现变化趋势;更为重要的是,企业中通常会有很多运行在不同服务器上的应用,每个应用都需要监控,我们可以编写一个远程客户端,这个远程客户端可以连接到所有要监控的服务器。
JMX 可以以多重方式来访问JMX技术监测信息,既可以通过现有的管理协议,比如简单网络管理协议(SNMP),也可以通过专利性的协议。MBean server依赖协议适配器(adaptors)和连接器(connectors)来让JMX代理供管理程序(位于JMX代理所在的JVM之外)访问。
每个适配器都通过一个特定的协议提供一个包含了所有注册在MBean Server中的MBeans的视图。比如,一个HTML适配器可以在一个浏览器中显示一个MBean。
连接器提供一个 管理器侧的 接口,该接口处理管理程序和JMX Agent之间的通信。不同的连接器 通过不同的协议 提供相同的远程管理接口。当一个远程管理程序使用该接口时,它可以通过网络透明地连接到一个JMX Agent,而不论该协议是什么。JMX技术提供一个标准的方案,用于导出基于JMX技术的监测信息,供基于Java RMI的应用程序使用。