老技术新谈,Java应用监控利器JMX(3)
各位坐稳扶好,我们要开车了。不过在开车之前,我们还是例行回顾一下上期分享的要点。
上期我们深入的聊了聊 JMX,把 JMX 的架构了解了七七八八,最后通过代码实战,解决系列疑问,实现远程动态修改应用参数,让线上服务升级、参数调优等系列问题不再难。
说着说着,脑子里突然闪过,过往公司的一次闲聊的场景。那是一个我认为做的非常成功的老码农,给我们分享他的过往,大概是说他们那时候会点技术都很牛掰,面试如果问知道 JSP 吗?如果说知道,那接下来就是明天来上班吧,因为懂的人特别少;然后又分享了一个临近春节,发现线上服务老停,依靠重启来临时解决,但是要过春节,然后就和另一位同事想起临时解决方案:一旦服务发现问题,会发送短信通知,接受短信指令完成服务重启。
现在想想他们为什么要靠短信指令来实现重启呢?无论他分享的这个故事,掺杂水分多少暂且不谈,就凭目前那两位老码农,一个是产品总监、一个是副总裁,而我还在苦逼哈哈的撸代码,我就不得不信服啊。
好了,其它不扯啦,撇下故事情节,get 到重点:如何实现服务的重启?现在已是 9012 年啦,同样的问题,放在当下该如何解决呢?
我们都知道从事编程,没有什么银弹,唯一的银弹就是照猫画虎的多练,其实也就是熟读唐诗三百首,不会作诗也会吟,那不妨就看看别人咋实现的。
倒腾出 Resin 的源码,虽然很多人都是第一次与 Resin 谋面,没关系你就认为是 Tomcat 就好了,只要能打通任督二脉,管它是啥呢,主要是实现思想。
面对一个开源项目或者技术轮子,我常用的大概有以下几招,接下来把招式一五一十的都献上,请各位笑纳。
招式一:用一用
先把源码跑起来,看一看,用一用,想一想。导入项目,准备工作一定要做到位,然后依据 manifest 清单文件(稍微规范点的都有这个文件),找到应用程序入口。
Resin 源码运行时需要传入参数 watchdog,其实支持 N 多命令(不深究)。
访问 http://127.0.0.1:8080/ 看看启动成功没?
点击 /resin-admin 访问 resin 监控管理平台,首次登陆需要配置用户名密码,后续直接登录即可,成功页面如下。
点点菜单玩一玩,点击 memory 菜单,效果如下,但是数据怎么来的呢?疑问先放一边,不要阻碍功能体验。
再点击 thread 菜单,效果如下,但是数据又是怎么来的呢?疑问还是先放一边,不要阻碍功能体验。
点击 webapp 菜单,效果如下,关键是对应的 Actions 操作还真能完成对应的服务的 start、stop、restart,天啦撸,惊呆了众人有没有。
其它菜单也可以肆意的点点看,可能有意想不到的惊喜。
招式二:问一问
抱着自己的疑惑,去摸索,尝试灭掉心中的疑问。请来 JConsole 来个助攻,控制台敲入 jconsole,连上 Resin 进程,打入 Resin 内部,窥探一下。
看看上面点击 memory 菜单中的数据从哪儿来的?果不其然,发现 Resin 自定义了一个 MemoryMXBean ,而且里面的属性刚好与 memory 菜单中对应上。那大概知道咋回事了,你清楚了没?没搞懂的猿粉后台直接留言啊。
再看看上面点击 thread 菜单中的数据从哪儿来的?意料之中,发现 Resin 自定义了一个 ThreadPoolMXBean ,而且里面的属性也刚好与页面上的对应上,大概也就是那么回事儿,你 get 到了没?
不妨再看看点击 webapp 菜单时,那些 start、stop、restart 如何又是让服务完成对应重启、停止、重启操作的呢?不得不说 Resin 还是按照常规的设计,自定义了一个 WebAppMXBean,而且提供了 start()/stop()/restart() 等操作方法,不得不说设计很高端。
说到这,那不妨演示一下服务的停止、重启功能,不然难以服众,再次点击 resin-admin 的 webapp 菜单,效果如下。
回到 JConsole 页面,我们点击 stop() ,停止 resin-admin 服务,直接看图就行。
此时我们再访问管理控制台页面,果不其然,服务不可用。
不妨在 JConsole 中点击 start() 启动一下服务,看图就行。
此时我们再访问 resin-admin 管理控制台页面,居然又可以正常访问,真是逆天的节奏。
备注:借助 JConsole 是为了看清楚定义了很多 MXBean,其实页面上的 start、stop、restart 按钮完成的功能 与 JConsole 的操作是一样的。
招式三:记一记
深入任何框架源码,打日志是必不可少的环节,为了便于把源码流程给串起来,关键位置一定要打印属于自己风格日志,最好是狂打属于自己的日志,然后跑起来用日志串一串流程。
招式四:画一画
是否可以画画类图?梳理梳理关系,在全局上看一看。如果用的是 IDEA,那么生成类图,超级之简单。选择接口或者类,然后右键选择菜单 Diagrams --> Show Diagram... (请记住该操作,平时工作中真会帮助你省很多事情)
效果如下,清晰明了,系列 MXBean 映入眼帘,并且继承关系与咱们的日志的打印差不多(看不清的放大了看啊,哈哈)。
难道一个 Resin 应用服务器就这么点玩意,其实真实是下面这样的,真的好庞大(图片看不清,其实这个真看不清就对了,需要用高倍望眼镜,复杂的有点辣眼睛),但是实现套路都是一样的,都是一系列的 MXBean 定义。
是否也可以画画时序图?答案是必须的,前提是 IDEA 装了 SequenceDiagram 插件,举个栗子(只是举栗,重在告诉你方式方法)。
招式五:猜一猜
访问 http://127.0.0.1:8080/resin-admin/?q=index&s=0 前端页面咋运转的?
潜心去看,会发现 resin-admin 的页面是 PHP 语言实现的,其实很简单,就是获取请求 URL 中的 q 参数,然后直接把对应的 page 页面展示出来,如果传入的 q 参数是空,则默认展示 summary 页面。
例如http://127.0.0.1:8080/resin-admin/?q=memory&s=0 则会把 memory.page 展示出来,可以看到里面是通过访问MBeanServer 找到对应的 MemoryMXBean 并获取对应的值。
招式六:仿一仿
思考我们是否可以借鉴思想去实现呢?照猫画虎,答案是肯定的,今天就先不深入去开展了。
好了,今天主要借助对 Resin 源码的简单剖析,让我们更深入理解 JMX 的应用;同时想传达面对框架源码或者技术轮子时,平时我常用的一些方式方法,简单划分为六大招式:用一用、问一问、记一记、画一画、猜一猜、仿一仿,希望对你能有点帮助。
好了,今天的车要到站了,还有很多应用场景没有说,咱们还是且听下回分解吧,真心希望一猿小讲的每篇分享都能帮到你一点点。
最后如果感觉有点帮助,不妨来个疯狂分享转发,因为你的每一次分享,我都认真当成了鼓励与喜欢。
老技术新谈,Java应用监控利器JMX(3)的更多相关文章
- 老技术新谈,Java应用监控利器JMX(2)
各位坐稳扶好,我们要开车了.不过在开车之前,我们还是例行回顾一下上期分享的要点. 上期由于架不住来自于程序员内心的灵魂的拷问,于是我们潜心修炼,与 Java 应用监控利器 JMX 正式打了个照面. J ...
- 老技术新谈,Java应用监控利器JMX(1)
先聊聊最近比较流行的梗,来一次灵魂八问. 配钥匙师傅: 你配吗? 食堂阿姨: 你要饭吗? 算命先生: 你算什么东西? 快递小哥: 你是什么东西? 上海垃圾分拣阿姨: 你是什么垃圾? 滴滴司机: 你搞清 ...
- Java应用监控利器JMX
啥是 JMX? The Java Management Extensions (JMX) API is a standard API for management and monitoring of ...
- (转)如何学习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去麦当劳或肯 德基,只管向服务员说“来四个鸡 ...
随机推荐
- 关于Java序列化的问题你真的会吗?
引言 在持久化数据对象的时候我们很少使用Java序列化,而是使用数据库等方式来实现.但是在我看来,Java 序列化是一个很重要的内容,序列化不仅可以保存对象到磁盘进行持久化,还可以通过网络传输.在平时 ...
- go中处理各种请求方式以及处理接口请求参数
话不多说直接上代码,解读内容全部在代码中 1.处理请求方式 package main import ( "fmt" "io/ioutil" "net/ ...
- Python基础类型(1)
整数 整数在Python中的关键字用int来表示; 整型在计算机中运于计算和比较 在32位机器上int的范围是: -2**31-2**31-1,即-2147483648-2147483647 在64 ...
- 【JDK】JDK源码分析-HashMap(2)
前文「JDK源码分析-HashMap(1)」分析了 HashMap 的内部结构和主要方法的实现原理.但是,面试中通常还会问到很多其他的问题,本文简要分析下常见的一些问题. 这里再贴一下 HashMap ...
- [日志分析]Graylog2进阶之获取Nginx来源IP的地理位置信息
如果你们觉得graylog只是负责日志收集的一个管理工具,那就too young too naive .日志收集只是graylog的最最基础的用法,graylog有很多实用的数据清洗和处理的进阶用法. ...
- 3分钟入门lambda表达式
本节是lambda表达式的一个入门课,讲解的同时配有练习demo 前言什么是lambda表达式?基础语法函数式接口自己实现一个函数式接口jdk提供的函数式接口Consumersupplierfunct ...
- 【Weiss】【第03章】练习3.3:通过交换指针交换单/双链表元素
[练习3.3] 通过之调整指针(而不是数据)来交换两个相邻的元素,使用 a.单链表 b.双链表 Answer: 先放测试代码,折叠标题可以看到分别是哪种链表的测试. 实测可满足题意,但单链表和双链表的 ...
- mysql主从复制(主从同步)
mysql主从同步 1.mysql主从同步(复制)概念 1. 将Mysql某一台主机数据复制到其它主机(slaves)上,并重新执行一遍来实现的. 2. 复制过程中一个服务器充当主服务器,而一个或多个 ...
- eclipse操作快捷键
Eclipse最全快捷键,熟悉快捷键可以帮助开发事半功倍,节省更多的时间来用于做有意义的事情. Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ ...
- 项目中用到了Redis分布式锁,了解一下背后的原理
前言 以前在学校做小项目的时候,用到Redis,基本也只是用来当作缓存.现在博主在某金融平台实习,发现Redis在生产中并不只是当作缓存这么简单.在我接触到的项目中,Redis起到了一个分布式锁的作用 ...