老技术新谈,Java应用监控利器JMX(2)
各位坐稳扶好,我们要开车了。不过在开车之前,我们还是例行回顾一下上期分享的要点。
上期由于架不住来自于程序员内心的灵魂的拷问,于是我们潜心修炼,与 Java 应用监控利器 JMX 正式打了个照面。
JMX 在我看来可谓是如陈年老酒般越品越有味,通过品这款老酒,我们认识了 Java 中你可能从未相识的名词 JCP、JSR;又耍了一把 JDK 内置的两款基于 JMX 的可视化监控、管理工具 JConsole 以及漂亮的 jvisualvm ;同时我们又感受了一下长得虽然不咋滴,但是功能还算可以的 jmxtools 工具包。
用一句话简单总结:JMX 是真香!如果你还未感受到她的魅力,也没关系,相信通过近期的几篇分享会让你深深的爱上她。
大家是否还记得,上期最后遗留了几个疑问,我们再简单梳理梳理,不妨今天就来个各个击破。
遗留疑问1:当我们看源码时也会发现诸多 XxMXBean 的定义,那到底 MXBean 又是啥呢?MBean 与 MXBean 啥区别呢?
遗漏疑问2:咱们既没有定义获取内存的方法,也没有定义获取线程等方法定义,但是 JConsole 等管理页面上展示的数据从哪儿来的呢?
好了,怀揣着疑问,正式开始我们今天的分享。
1.
其实讲真,虽然咱们已经与 JMX 打了个照面,但是还是应该从全局架构上再深入的挖一挖、处一处。
如上图所示,JMX 的全局架构从下至上主要分为资源层、代理层、适配层。其中资源层主要定义被管理的 MBean,也就是被监控的应用;代理层主要用于注册和管理 MBean;适配层也称为连接层,主要实现了各种连接协议,如 HTTP、RMI、SNMP。
那个远程管理层主要是指咱们的监控管理应用,理解成客户端就行了。
架构搞懂个七七八八,了解个全局的梗概,那不妨回头看看上期一起撸的代码,结合代码来一次对号入座。
其实细心的猿粉早已经发现,上期的代码中根据文件名称应该能猜个八九不离十。
App 类,就代表要进行监控的资源(应用),对应就是资源层; AppMBean 接口,代表代理层可以对监控的应用进行哪些操作; AppAgent 类,见名知意,对应的是代理层; jmxtools 、jconsole、jvisualvm 工具,对应的就是远程管理应用。
确实是那么回事,确实有点儿意思。
2.
说一千道一万,终究还是没有解决咱们的疑问:当我们看框架源码时会发现诸多 XxMXBean 的定义,那到底 MXBean 是啥呢?MBean 与 MXBean 啥区别呢?那我们不妨从官网搜罗搜罗。
The MXBean concept provides a simple way to code an MBean that only references a predefined set of types, the ones defined by javax.management.openmbean. In this way, you can be sure that your MBean will be usable by any client, including remote clients, without any requirement that the client have access to model-specific classes representing the types of your MBeans. ——摘自官方档,感兴趣的可以通过如下链接进行仔细品味品味。
https://docs.oracle.com/javase/8/docs/api/javax/management/MXBean.html
其实约莫就是说:
MXBean 提供了一种简单的方法来编写引用自定义类型的 MBean; 通过 MXBean,可以确保 MBean 被任何客户端使用,而不需要客户端关心 MXBean 中引用类型的类。
但是我估计你依然还是很茫然啊,依然还是很懵逼,那不妨举个栗子吧。
首先在上期分享的代码基础之上,为我们的 App 应用配备一条看门狗 Watchdog。
接着给被管理的应用 App 加入看门狗 Watchdog。
然后在 AppMBean 接口中暴漏操作方法。
紧接着在代理层 AppAgent 创建一条看门狗,并给 App 加上。
代码秒撸完,跑起来看一看,一切就绪,请出应用管理工具 JConsole 玩一玩,天啦撸!发现看门狗的值居然显示不可用?!
这不是 Bug,不过请你务必记住 MBean 的这个效果,因为一会儿就被搞没了。那接下来不妨把 AppMBean 修改为 AppMXBean。
接着把 App 实现的接口也替换为 AppMXBean。
代码瞬间就改完,还是需要跑起来看一看,一切又准备就绪,再请出 JConsole 耍一耍。
出乎意料看门狗居然有值啦,而且是 javax.management.openmbean.CompositeDataSupport,天啦噜,这是啥?点点看看有没有惊喜。
果不其然,点完瞬间清晰,原来是看门狗的值,厉害厉害。
好了,演示接近尾声,那你搞懂了没?其实说白了 MXBean 就是比 MBean 多了个牛 X(叉),支持自定义引用类型的数据展示。
3.
搞定了 MXBean 与 MBean的区别,针对「既没有定义获取内存的方法,也没有定义获取线程等方法定义,但是监控页面上展示的那些内存等数据到底从哪儿来的呢?」的问题,那不妨再扒一扒 JDK 的 API ,咱们有没有良方能对症。
我们先扒一扒 JDK 5 的 API,会发现 java.lang.management 包下存在诸多内置的 MXBean 定义。
https://docs.oracle.com/javase/1.5.0/docs/api/index.html?java/lang/management/package-summary.html
我们再扒一扒 JDK 8 的 API,同样会发现 java.lang.management 包下存在诸多内置的 MXBean 定义,而且随着 JDK 版本的提升,MXBean 也逐渐增多啦。
https://docs.oracle.com/javase/8/docs/api/index.html?java/lang/management/package-summary.html
到这一步,迷茫疑惑的我们,应该稍微清晰了不少,但是做学问有些时候,还是需要打破砂锅问到底,这些到底都是干啥用的?那不妨把 JDK 5 与 JDK 8 中共性的 MXBean 定义,画个脑图彻底解释一下,因为有些在工作中确实会用到。
我相信通过上面的的手册,再去深入中间件也好、开源的框架也罢,肯定会遇鬼杀鬼、顺风顺水。
4.
程序猿灵魂拷问:动态修改应用的参数信息,你能改吗?
是时候再一次正式面对程序猿的灵魂拷问啦,那面对这个灵魂拷问,该何解?
接下来容我慢慢絮叨,先说说解决思路:是否可以把需要配置的参数放在一个 MBean 中,然后考虑到方便,再提供了一个管理配置页面,这样是否可行呢?咱们还是写段代码验证一下可行性。
首先定义一个参数配置的接口 ConfigMXBean。
然后定义被管理对象 Config,并且实现 ConfigMXBean 接口。
接着编写代理层 ConfigAgent,并采用 jmxtools 提供页面管理。
代码编写完,跑起来探一探,然后浏览器访问 http://localhost:8888/ 效果如下。
当我们选择true,并点击 Apply,控制台输出为true。哇塞!很神奇,亲测可用。
好了,分享一个不重启应用,而动态修改参数的一个简单实现思路,其实这个能干什么事情,比如使用 JMX 可以作为应用的开关,可以做一些新老功能的切换以及动态修改风险评分级别等等,自行脑补一下吧。
5.
说句掏心窝的话,我为什么要分享这个技术点?因为很多开源的轮子以及中间件,大概率都有这种实现方式,例如数据库连接池 Druid 使用了 JMX 来进行自身的监控;例如 Resin、Tomcat、weblogic等等,打娘胎里都提供了JMX服务,所以还是很有必要梳理梳理,然后分享给你们,万一你们也能用到呢(捂嘴笑)。
好了,今天的车要到站了,还有很多应用场景没有说,咱们还是且听下回分解吧,真心希望一猿小讲的每篇分享都能帮到你一点点,最后预祝各位在今后的日子里,大鹏展翅同风起、扶摇直上九重天。
老技术新谈,Java应用监控利器JMX(2)的更多相关文章
- 老技术新谈,Java应用监控利器JMX(1)
先聊聊最近比较流行的梗,来一次灵魂八问. 配钥匙师傅: 你配吗? 食堂阿姨: 你要饭吗? 算命先生: 你算什么东西? 快递小哥: 你是什么东西? 上海垃圾分拣阿姨: 你是什么垃圾? 滴滴司机: 你搞清 ...
- Java应用监控利器JMX
啥是 JMX? The Java Management Extensions (JMX) API is a standard API for management and monitoring of ...
- 老技术新谈,Java应用监控利器JMX(3)
各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 上期我们深入的聊了聊 JMX,把 JMX 的架构了解了七七八八,最后通过代码实战,解决系列疑问,实现远程动态修改应用参 ...
- (转)如何学习Java技术?谈Java学习之路
51CTO编者注:这篇文章已经是有数年“网龄”的老文,不过在今天看来仍然经典.如何学习Java?本篇文章可以说也是面对编程初学者的一篇指导文章,其中对于如何学习Java的步骤的介绍,很多也适用于开发领 ...
- IBatis.Net 老技术新研究
我们现在用的数据访问组件封装了IBatis.Net框架,提供了标准的数据访问接口和服务.正好总结一下老技术IBatis.Net在进行实际的数据访问开发之前,我们先了解一下:IBatis.Net中几个重 ...
- 微软ASP.NET技术“乱谈”
微软ASP.NET技术“乱谈” 2014新年了,顺手写的一点文字,主要谈谈我对当前微软ASP.NET技术的看法,比较随意,大伙儿随便看看吧. 1 当前微软Web平台技术全貌 从2002年发布.NET ...
- Java 7 中的Switch 谈 Java版本更新和反编译知识
Java 7 中的Switch 谈 Java版本更新和反编译知识 学习编程,享受生活,大家好,我是追寻梦的飞飞.今天主要讲述的是Java7中的更新Switch实现内部原理和JAD反编 ...
- 从追MM谈Java的23种设计模式(转)
从追MM谈Java的23种设计模式 这个是从某个文章转载过来的.但是忘了原文链接.如果知道的,我追加一下. 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西 ...
- 从追MM谈Java的23种设计模式
从追MM谈Java的23种设计模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯 德基,只管向服务员说“来四个鸡 ...
随机推荐
- EF多租户实例:如何快速实现和同时支持多个DbContext
前言 上一篇随笔我们谈到了多租户模式,通过多租户模式的演化的例子.大致归纳和总结了几种模式的表现形式. 并且顺带提到了读写分离. 通过好几次的代码调整,使得这个库更加通用.今天我们聊聊怎么通过该类库快 ...
- golang sms阿里云发送短信(公司实际项目)
话不多说,直接上代码!!! 要先下载两个包 (可以go get -u +你想要的包) github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests githu ...
- html5 cavans的小应用
1.canvas鼠标画线,canvas小方块移动,canvas小方块旋转并缩放 <!doctype html> <html> <head> <meta cha ...
- Hadoop集群搭建(四)~centos6.8关闭防火墙
一.centos关闭防火墙 1,关闭防火墙.service iptables stop 2,关闭防火墙开机自启.chkconfig iptables off 3,查看防火墙状态.service ipt ...
- D2T1服务器需求——毒?瘤题(并不是
这题我第一眼居然差点错了\(OTZ\) 然后写了线段树,还写挂了-- 写好了\(query\)操作,发现似乎不需要区间查询,然后又删掉-- 看着这熟悉的操作,似乎在哪里见过-- 然后我莫名其妙把一个\ ...
- Qt5小Demo之猜数字游戏
玩法:设定时间进行猜数字,所猜数字为一个四位数,输入自己的数字,系统会提示是大了还是小了,依据条件逐步逼近正确结果.在规定时间里猜对即获胜,否则即失败. 平台支持:Win10下测试正常. 源码地址: ...
- libfastcommon总结(一)加载主机上所有网卡的IPv4的地址
头文件为local_ip_func.h 主要接口 load_local_host_ip_addrs();//加载主机网口所有IPv4地址到列表 print_local_host_ip_addrs ...
- Vue.js组件嵌套和template外用
Vue.extend组件的嵌套和template外用 组件嵌套分为全局组件嵌套和局部组件嵌套 组件嵌套需要将子元素写在父元素内 子组件必须在父组件中注册之后才能在父组件的模板中使用 全局组件嵌套 Vu ...
- The Game Of Life – 数据结构与算法的敲门砖
The Game Of Life(生命游戏,又称为细胞自动机)几乎是所有数据结构与算法导论教程前言的一个很经典的程序了.这是一个零玩家游戏,发生在一个平面网格里.每个格子的细胞都有死亡和存活两种状态, ...
- WPF 启动缓慢问题
Actually there's 2 main reasons that the default project type for WPF applications is x86. Intellitr ...