一.大名鼎鼎的监控功能:
Druid号称拥有线上监控的功能,可以动态实时的监控,线上的指标。如何做到的?实际上它是通过java 语言,提供的JMX工具,不了解JMX的可以到官网看下,这里大概叙述下JMX的功能。
二.JMX的使用
1. JMX简单介绍
JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准 的代理和服务,实际上,用户可以在任何Java应用程序中使用这些代理和服务实现管理。主要用于对JAVA应用程序和JVM进行监控和管理。
2. MBean与MXBean的介绍
类型 描述
standard MBean 这种类型的MBean最简单,一个标准的MBean由一个MBean接口(该MBean接口列出了所有被暴露的属性和操作对应的方法)
和一个class(这 个class实现了这个MBean接口并提供被监测资源的功能)组成(接口和class必须放在同一个包下,不然会出错)。
它的命名也必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean。标准MBean只能操作基本数据类型,
如 int、dubbo、lang等
dynamic MBean 必须实现javax.management.DynamicMBean接口,所有的属性,方法都在运行时定义
open MBean 此MBean的规范还不完善,正在改进中
model MBean 与标准和动态MBean相比,你可以不用写MBean类,只需使用javax.management.modelmbean.RequiredModelMBean即可。
RequiredModelMBean实现了ModelMBean接口,而ModelMBean扩展了DynamicMBean接口,因此与DynamicMBean相似,
Model MBean的管理资源也是在运行时定义的。与DynamicMBean不同的是,DynamicMBean管理的资源一般定义
在DynamicMBean中(运行时才决定管理那些资源),而model MBean管理的资源并不在MBean中,而是在外部(通常是一个类),
只有在运行时,才通过set方法将其加入到model MBean中。
MXBean
MXBean是MBean的一种,MXBean与MBean一样都需要定义一个接口和class类,但是MXBean并不要求Java类的名称必须与接口名称前部分相同。另外MXBean中还可以正常使用自定义数据类型;
如果在MBean中使用自定义数据类型的话,通过JConsole查看时会显示不可用。 当MXBean中使用被转换成CompositeDataSupport类
3. JMX的使用
标准MBean 使用规范
标准的MBean由一个MBean接口和一个Class类组成,并且接口必须命名为 xxxMBean 而 Class类名必须为 xxx 放与同一个包下,若不在同一包下运行时将出异常。
JMX的使用步骤
1. 定义接口与资源实体类,接口中定义属性与操作;get表示可读,set表示可写。
2. 创建Agent类。
a. 创建MBeanServer,相当于管理MBean的容器,创建方式有两种一获取JVM中默认启动的Mbean server 或者 自己创建。
b. 创建ObjectName,用于标识唯一的资源MBean,格式为:"域名:name=MBean名称"。
c. 绑定MBean与对应的ObjectName并注册到MBeanServer。
至此即可通过JConsole管理本地的MBean的先关信息了,同事也可以提供其他的连接方式,如:
3. rmi连接方式。
a. 注册监听端口号。
b. 创建JMXServiceURL,格式为:service:jmx:rmi://localhost:0/jndi/rmi://localhost:1099/jmxrmi(完整版) JMXServiceURL格式说明 。
c. 创建jmxConnectorServer,绑定MBserver与Url。
4. HtmlAdaptor连接管理方式(需要引入jmxtools.jar)。
a. 创建Html适配器,并设置监听端口。
b. 创建适配器ObjectName,绑定Html适配器并注册到MBeanServer。
c. 开启适配器。
具体使用详情,参考如下代码
下面是一段Druid注册Driver的代码
//1.注册driveManager
DriverManager.registerDriver(driver);
try {
//2. 添加DruidDriverMBean参数的监控
MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
ObjectName objectName = new ObjectName(MBEAN_NAME);
if (!mbeanServer.isRegistered(objectName)) {
//把需要管理的ObjectName,注册到JMX服务端上去,可以在JMX客户端看到
DruidDriver 类中对应的属性值
mbeanServer.registerMBean(instance, objectName);
}
} catch (Throwable ex) {
if (LOG == null) {
LOG = LogFactory.getLog(DruidDriver.class);
}
LOG.warn("register druid-driver mbean error", ex);
}
今天我们介绍了一下监控使用的工具,下篇我们介绍,生成监控指标的整理流程,敬请期待。