【这是一猿小讲的第 46 篇原创分享】
各位坐稳扶好,我们要开车了。不过在开车之前,我们还是例行回顾一下上期分享的要点。
上期我们深入的聊了聊 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 的应用;同时想传达面对框架源码或者技术轮子时,平时我常用的一些方式方法,简单划分为六大招式:用一用、问一问、记一记、画一画、猜一猜、仿一仿,希望对你能有点帮助。
好了,今天的车要到站了,还有很多应用场景没有说,咱们还是且听下回分解吧,真心希望一猿小讲的每篇分享都能帮到你一点点。
最后如果感觉有点帮助,不妨锻炼一下手指点个在看,或者再来个疯狂分享转发,因为你的每一次分享,我都认真当成了鼓励与喜欢。
推荐阅读: