一、前言server.xml 配置,是 Tomcat启动配置,从配置结构可以看出 Tomcat 的整体架构 。如果能够了解其常用配置项,对 Tomcat有一个高屋建瓴的把握,然后再庖丁解牛,一步步深入源码中分析每一个核心功能的实现细节,这样会有事半功倍的效果 。
1.1 server.xml配置示例
文章插图
- 如上图 server.xml 配置,最外层是一个 Server,代表 Tomcat的运行实例 。Server 里有一些监听器 Listener,一个不知道干啥的 GlobalNamingResources,还有一个 Service,通过阅读源码,发现一个 Server 里可以有多个 Service 。
- Service可以理解为是对部署在Tomcat里的服务的抽象,一个Tomcat可以部署多个服务,但是我更喜欢把一个Service理解成一个服务集合或者集群 。
- Service里有一个 Executor、Connector 和 Engine 。Executor是一个线程池,可以供 Contector使用;Connector 定义了协议连接(HTTP/AJP),外界就是通过Connector访问Service里的服务的;Engine是容器引擎,可以理解它为Servlet容器,真正的业务处理在Engine里 。通过阅读源码,一个Service可以有多个Executor,多个Connector,一个Engine 。如果把Service比作一个房子,Connector比作门,一个房子可以有多个门就好理解了 。
- Engine内部较复杂,它内部就像俄罗斯套娃,有多个子容器,子容器下又可以有多个子容器 。正如Engine的英文含义,引擎,驱动和管理内部子容器 。因为是最顶端的管理者,会包含一些组件辅助管理子容器 。Engine可以有多个Host容器,可以理解为虚拟主机(URL地址中主机部分抽象);Host容器里有多个Context容器,Context就是一个个Web应用;Context容器里有多个WrApper容器,server.xml中一般不用配置,Wrapper是对Servlet的包装,就是一个个业务功能了 。
- 如果对应上Service房子的比喻,Engine可以比作房子里所有房间的总和,或者是通向每个房间的走道,Host就是一个个房间,房间里有一些家具家电(Context),每一个家具家电有很多功能(Wrapper) 。
文章插图
二、Tomcat运行实例ServerServer是Tomcat运行实例的抽象,管理着内部多个服务 。在Tomcat源码中Server的默认标准实现是
org.Apache.catalina.core.StandardServer:
- 默认有6个生命周期监听器,监听Server不同运行阶段的事件并作出响应 。
- GlobalNamingResources全局命名资源,通过JNDI提供统一的命名对象访问接口 。
- Server监听了一个端口,默认8005,如果这个端口传来SHUTDOWN指令,则关闭Tomcat 。
- Server还有两个定时任务,监听触发一些在Tomcat整个生命周期里周期性事件,暂时只有自动部署 。
org.apache.catalina.startup.VersionLoggerListener监听初始化阶段,输出一些运行日志,如操作系统、JDK、Tomcat版本信息以及catalina.base、catalina.home的定义等 。
(2)AprLifecycleListener
Tomcat可以使用APR本地库从操作系统级别解决异步IO问题,通过JNI方式调用APR本地库大幅提高对静态资源的处理性能 。
org.apache.catalina.core.AprLifecycleListener对初始化前的事件和销毁后的事件感兴趣:
在Tomcat初始化前,AprLifecycleListener尝试初始化APR库,如果初始化成功,则使用APR接收并处理客户端的请求 。
【窥探Tomcat整体架构,server.xml常用配置解析】在Tomcat销毁后,AprLifecycleListener会对APR做一些销毁终止操作 。
(3)JreMemoryLeakPreventionListener
org.apache.catalina.core.JreMemoryLeakPreventionListener监听器会在Tomcat初始化时使用系统类加载器预先加载一些JRE的类和设置URLConnection缓存禁用属性,以避免线程上下文类加载器是Tomcat自定义的Webappclassloader时,加载JRE导致的内存泄漏和URLConnection缓存导致的锁文件问题 。
(4)GlobalResourcesLifecycleListener
org.apache.catalina.mbeans.GlobalResourcesLifecycleListener会在Tomcat启动时为JNDI创建MBean,停止时销毁MBean 。
(5)ThreadLocalLeakPreventionListener
org.apache.catalina.core.ThreadLocalLeakPreventionListener监听器监听Context停止后,销毁连接器Connector中Executor的所有核心工作线程,并重新创建,以避免使用ThreadLocal带来的内存泄漏 。
(6)NamingContextListener
org.apache.catalina.core.NamingContextListener监听器在Tomcat启动时创建并绑定全局命名资源,在Tomcat停止前做一些解绑全局命名资源、反注册销毁等操作 。
推荐阅读
- 吊打tomcat的高性能web服务器undertow
- Tomcat中如何开启https
- Tomcat、Jetty和Glassfish性能测试
- 最全Tomcat入门指南
- 上篇 一套亿级用户的IM架构技术干货:整体架构、服务拆分等
- 超实用的tomcat启动脚本实现
- 热加载和热部署,没听过?看看 Tomcat 是怎么实现的
- docker下拉取tomcat镜像以及配置,亲测可用
- centos7中利用logrotate工具切割tomcat日志
- 输入法会窥探隐私吗 多款输入法被指收集用户上传内容