CreateArtTechnology
/ Blog
Login
最新文章
Java
语言相关
库相关
虚拟机相关
CreateArtTechnology
项目搭建
使用的工具
自研的工具
开源工具
ELK
ElasticSearch
Jenkins
Markdown
GraphQL
Arthas
生产工具
Linux
Nginx
VersionControl
Subversion
Git
Redis
Archiva
Maven
Zookeeper
Spring
SpringBoot
MySql
HBase
Cassandra
容器化
Docker
Kubernetes
服务容器化从零开始
未分类笔记
算法相关
概念相关
豆知识
机器学习
机器学习从零开始
Tomcat源码笔记 - 2.核心组件继承结构分析及JMX简单介绍
20
2019-05-10 18:48:55
未分类笔记
## 背景 `org.apache.catalina.core`包下都是Tomcat最核心的组件,包括Server接口的实现类`StandardServer`,Engine接口的实现类`StandardEngine`等。 这些核心组件类的基本继承结构都是,继承`org.apache.catalina.util.LifecycleMBeanBase`,并实现`org.apache.catalina`包中中对应的接口: ```java // Server接口的实现继承LifecycleMBeanBase public final class StandardServer extends LifecycleMBeanBase implements Server // Engine接口的实现,其中ContainerBase继承LifecycleMBeanBase public class StandardEngine extends ContainerBase implements Engine public abstract class ContainerBase extends LifecycleMBeanBase implements Container ``` 实现对应接口很好理解,那么这个`LifecycleMBeanBase`是什么?为什么都要继承这个类? ## LifecycleMBeanBase介绍 ![](/img/pic/2019051018461820507_jpeg_708_638_79834) > LifecycleMBeanBase继承结构,这是个简化的类图 我们一个一个捋一捋这些类或者接口的工作是什么。 ### Lifecycle接口 这个主要是定义了组件的生命周期,包括生命周期状态和改变生命周期状态的触发动作等。 另外还定义了设置监听器的功能。 ### LifecycleBase抽象类 实现了Lifecycle中定义的监听器相关功能,并实现了改变生命周期状态的触发动作。 在改变状态的方法中,均调用了新增的对应功能的抽象internal方法,比如实现init时: ```java // 覆盖Lifecycle方法 @Override // 使用synchronized关键字保证线程安全 public final synchronized void init() throws LifecycleException { // 确认状态 if (!state.equals(LifecycleState.NEW)) { invalidTransition(Lifecycle.BEFORE_INIT_EVENT); } try { // 改变生命周期状态,会发送对应的事件消息给监听器Listener setStateInternal(LifecycleState.INITIALIZING, null, false); // 调用init对应的抽象方法initInternal initInternal(); // 改变生命周期状态,会发送对应的事件消息给监听器Listener setStateInternal(LifecycleState.INITIALIZED, null, false); } catch (Throwable t) { handleSubClassException(t, "lifecycleBase.initFail", toString()); } } ``` 实现的其他方法中,做的工作基本差不多。可以说,作为Lifecycle的Base,这个类的工作做得相当好: - 作为状态机保证Lifecycle状态正常流转 - 确保每当状态改变时都会发送BEFORE-DOING-DONE三条事件消息 - 留出足够的扩展性,真正状态改变时的业务逻辑作为抽象方法让子类实现 ### MBeanRegistration接口 Java的JMX(Java Management Extensions)相关接口,提供了几个注册相关的方法,子类可以作为MBean进行注册。 我们目前只需要知道JMX中的MBean可以注册到资源监控容器中,由远程监控甚至修改。 ### JmxEnabled接口 提供了Domain和ObjectName相关的方法,这些也是与JMX相关的,后边我们会说到。 ### LifecycleMBeanBase抽象类 这个类一方面继承了LifecycleBase抽象类,实现了LifecycleBase中定义的`initInternal`、`destroyInternal`这两个抽象方法;另一方面,实现了JmxEnabled接口,也就实现了MBeanRegistration接口,主要是提供了注册到JMX容器的方法和取消注册的方法。 两者结合,在子类的生命周期状态触发init逻辑,也就是调用initInternal方法时,会在JXM注册;反之,在触发destroy逻辑也就是调用destroyInternal方法时,会从JMX取消注册。 总的来说,LifecycleMBeanBase类抽离了与业务无关但在组件中会经常复用的功能,包括: - **Lifecycle状态机** - **Lifecycle事件机制** - **JMX的管理** 在继承了这个类的Tomcat的核心组件中,这些功能直接可用。 ## Java Management Extensions介绍 JMX这个功能可以类比为Windows中的资源管理器,Java将已注册的MBean信息集中起来并暴露了监控和修改。 细节我们不多介绍(我不懂,也没细看),但是我们可以通过JDK自带的jconsole直观地看一下JMX有什么用。 ### jconsole使用方法 **打开jmxremote** 添加如下参数到Tomcat启动参数中: ```shell -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.134.66.204 -Dcom.sun.management.jmxremote.port=12312 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false ``` 我们在`10.134.66.204:12312`上打开了jmxremote,并关闭了权限校验,这样我们可以从远程监控JXM信息。 **打开jconsole** 在Windows上运行`JAVA_HOME/bin/jconsole.exe`,提示可以查看本地或远程的进程。我们在远程进程中输入之前配置的ip、端口信息: ![](/img/pic/2019051018453557204_jpeg_900_750_77530) > 新建链接,由于没打开SSL,新建后会有个风险提示 **查看JVM信息和MBean信息** JVM信息包括堆、线程、CPU占用率、GC等等信息。 ![](/img/pic/2019051018454726705_jpeg_900_750_126819) > 除了图形化展示外,最有意思的是可以手动控制执行GC 在MBean一栏中,我们可以找到前文提到的集成LifecycleMBeanBase的一些Tomcat的相关MBean,默认根目录是`Catalina`: ![](/img/pic/2019051018460350106_jpeg_900_750_137031) > 同样,除了一些属性展示外,还可以进行操作 ### 可视化工具Grafana 的确,JDK附带的jconsole界面看起来确实有点难看,可以尝试使用可视化工具Grafana: ![](/img/pic/2019051018472068708_jpeg_1913_981_281867) 恩,这样好看多了。 ## 参考资料 [【Tomcat学习笔记】11-Tomcat中的JMX | 谢晞鸣的博客](https://fdx321.github.io/2017/06/15/%E3%80%90Tomcat%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E3%80%9111-Tomcat%E4%B8%ADJMX%E7%9A%84%E4%BD%BF%E7%94%A8/)
发布文章 101
文章被阅读 1817
最近修改
什么是“丝滑”的曲线
2021-12-08 15:19:20
高效空间数据索引R树及其批量加载方法STR简介
2021-09-29 20:33:37
关于分库分表的一些事儿
2021-06-25 11:51:25
获得诺奖的稳定匹配理论之TTC算法与GS算法
2021-03-14 23:04:48
算法小白的机器学习入门实践,从零到上线
2021-01-13 14:28:27
分站宗旨
一站式资料平台,减少重复检索,减少重复采坑。