老技术新谈,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去麦当劳或肯 德基,只管向服务员说“来四个鸡 ...
随机推荐
- 第八章、小节二vuex
a.用vuex首先先安装vuex npm install vuex --save b.在src目录下创建store文件夹,在store中创建index.js存放各个状态 c.在一个模块化的打包系统中, ...
- js原型继承题目
var F = function(){}; Object.prototype.a = function(){}; Function.prototype.b = function(){}; var f ...
- LoadRunner 11破解方法:
LoadRunner 11破解方法: 请严格安装顺序操作! a.用LR8.0中的mlr5lprg.dll.lm70.dll覆盖LR11安装目录下“bin”文件夹中的对应文件: b.运行deleteli ...
- Python - 变量的作用域
变量作用域 Python能够改变变量作用域的代码段是 def . class . lamda. if/elif/else.try/except/finally.for/while 并不能涉及变量作用域 ...
- rpc框架dubbo学习入门及环境搭建(spring boot+Kotlin)
学习之前,确保有以下知识基础: Java网络编程 Socket传输数据 IO流 rpc简介及实现 rpc是remote procedure call的简写,意思为远程过程调用. rpc应用较多的情景是 ...
- 广告行业中那些趣事系列7:实战腾讯开源的文本分类项目NeuralClassifier
摘要:本篇主要分享腾讯开源的文本分类项目NeuralClassifier.虽然实际项目中使用BERT进行文本分类,但是在不同的场景下我们可能还需要使用其他的文本分类算法,比如TextCNN.RCNN等 ...
- Axure rp8 注册码,亲测可以用! 可用给个赞呗!!
License:zdfans Key:fZw2VoYzXakllUuLVdTH13QYWnjD6NZrxgubQkaRyxD5+HNMqdr+WZKkaa6IoE5N
- Comparing Data-Independent Acquisition and Parallel Reaction Monitoring in Their Abilities To Differentiate High-Density Lipoprotein Subclasses 比较DIA和PRM区分高密度脂蛋白亚类的能力 (解读人:陈凌云)
文献名:Comparing Data-Independent Acquisition and Parallel Reaction Monitoring in Their Abilities To Di ...
- 全文搜索技术--Solr7.1之配置中文分析器
前言:中国文化博大精深,但是solr只能一个一个的识别,而是更加符合中国人的习惯,所以加了中文分析器. 1.安装中文分词器 第一步:把中文分词器(ik-analyzer-solr7-7.x.jar)/ ...
- 新文预览 | IoU-aware Single-stage Object Detector for Accurate Localization
论文基于RetinaNet提出了IoU-aware sinage-stage目标检测算法,该算法在regression branch接入IoU predictor head并通过加权分类置信度和IoU ...