一、简介
Tomcat 服务器是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器。
简单来说Tomcat就是一个实现了HTTP协议的Server。
二、组件和体系架构简介
Tomcat的体系结构如图所示:
Tomcat的体系结构分为两层,一层是Tomcat管理组件,一层是Tomcat容器组件;而Connector(连接器)是沟通管理组件和容器组件的桥梁,Connector将一个请求传递至Container,容器自上而下的去处理该请求。
Tomcat的管理组件:Server、Service
此类组件主要是为了管理好Tomcat下级的各项组件以及内容。
容器组件:Engine、Host、Context、Wrapper
此类组件主要是为了分层次的去处理HTTP请求,每一层容器都有各自的职责。
Tomcat除了最底层的Warpper组件之外,其它所有的组件都是在server.xml配置文件中通过对应的标签设置。
三、组件详情
Server
该组件的集合代表的就是整个Tomcat(一般情况都只配置一个),主要是管理Tomcat的生命周期和管理Service。
对应标签:Server
子级标签:Listener、Service、GlobalNamingResources
常用标签属性:
属性 | 描述 |
port | 即监听关闭的端口,设置此属性可以通过命令去关闭该Servet下的Web应用 |
shutdown | 关闭端口的命令,最好自定义命令,默认是 SHUTDOWN |
Service
该组件用于管理连接器和容器,以及实现进行分组管理和设置共享线程池,一般情况下也只配置一个Service。
对应标签:Service
父级标签:Server
子级标签:Listener、Executor、Connector、Engine
常用标签属性:
属性 | 描述 |
name | 给该Service分组取个名 |
Connector
该组件是用于监听端口并接受客户端连接和请求,是容器和Server之间的桥梁,一个协议或者一个端口配置一个<Connector>标签。
对应标签:Connector
父级标签:Service
常用标签属性:
属性 | 描述 |
port | 服务的监听端口号,即ServerSocket的端口号,HTTP默认是8080 |
protocol | 支持的访问呢协议,默认是HTTP/1.1 |
connectionTimeOut | 连接超时时间,单位是毫秒,-1则表示不设置超时时间 |
executor | 使用哪个Service下的共享线程池,填写Service下的Executor标签的name |
URIEncoding | 使用的编码,Tomcat7默认是ISO-8859-1,Tomcat8默认是UTF-8 |
redirectPort | 不支持SSL时,接受到一个SSL的请求,则重定向到某个端口 |
Engine
该组件是容器的门面接口,用于接收Connector转发过来的请求,并放入流水线中处理。
对应标签:Engine
父级标签:Service
子级标签:Host、Listener、Valve
常用标签属性:
属性 | 描述 |
name | 为该Engine取名 |
defaultHost | 当找不到对应的域名Host时,使用的默认Host |
Host
该组件处理不同的域名或者不同IP访问时,根据不同的域名内容,去访问不同的Context,如一个网站配置了2个域名a和b,可以设置a域名访问一个Host下的Context,b域名访问另一个Host下的Conext。
对应标签:Host
父级标签:Engine
子级标签:Context、Valve、Alias、Listener
常用标签属性:
属性 | 描述 |
name | 为该Host取个名 |
appBase | Host的基础目录,即Host下所有的Web应用的目录路径,可以是绝对路径,也可以是相对$CATALINA_BASE的路径,默认是webapps |
autoDeploy | 开启热部署,及定时检测war的包变化然后重新加载Context,默认是true |
unpackWARs | 设置为true时,Tomcat会解压war包,否则以war的形式运行;设置为false时,则运行过程中无法更新war包,需要停止Tomcat,默认是true |
undeployOldVersions | 设置为true时,Tomcat检测到存在旧的war包会删除,默是false |
Context
该组件表示一个Web应用,即一个部署的war包,该组件是其应用下所有Servlet的集合,处理当前Web应用程序的所有请求,每个Web应用之间是相互隔离的,对应web.xml文件内容。
对应标签:Context和web.xml内容
父级标签:Host
子级标签:Parameter(对等于web.xml的context-param)、Vavle、ResourceLink、Resource、Listener
常用标签属性:
属性 | 描述 |
path | 访问后缀,即spring中的 server.servlet.context-path,设置则需要在uri开始处添加该值才能访问到Context |
docBase | Web应⽤⽬录或者war包的部署目录,可以是绝对路径,也可以是相对于Host中设置的appBase的相对路径。 |
cookies | 是否要将cookie用于缓存当前Context的会话标识,默认true |
reloadable | 是否开启热加载(即自动检测修改的class),消耗性能,调试时可以开,生产上最好关闭,默认false |
Wrapper
该组件是一个Servlet的包装,是Tomcat最后处理请求的地方,将请求最终传递到用户自定义的Servlet中,并且管理Servlet的生命周期和过滤器。
对应标签:web.xml中的Servlet
四、容器详情
在上文,我们知道Tomcat中的请求最终会交给容器处理,容器组件包括Engine、Host、Context、Wrapper,既然作为容器,自然会有它们的共性,下文将会从容器的共性介绍下容器的一些特性。
生命周期机制
Tomcat中的组件基本都实现了Lifecycle的接口,该接口定义了组件通用的生命周期,并且在Tomcat中默认实现:当父容器的生命周期方法被调用时,子组件对应的生命周期方法也会被调用,从而Tomcat能够通过管理最顶层的容器来管理所有的容器。
监听器机制
在组件的生命周期中,当一个生命周期被调用之后,都会发送一个对应的事件到Tomcat的监听器中,那么就可以通过监听对应组件的生命周期事件来做不同的处理。
在Tomcat中Engine、Host、Context都有自己对应的监听器,用于监听容器的生命周期相关的事件,并进行配置的管理。
Engine对应的监听器:EngineConfig
Host对应的监听器:HostConfig
Context对应的监听器:ContextConfig
PS:在Tomcat的源码中,很多跟配置有关的实现都是在对应的监听器中。
管道机制
容器组件Engine、Host、Context、Wrapper都配置了Pipeline(管道),当一个请求交到容器门面Engine中时,会调用Engine的Pipeline处理,Pipeline将请求通过一个个的Valve(阀)处理后,再由上至下的传递到下一个容器Pipeline中继续处理。
五、补充内容
1.标签完整内容可以参考Tocmat官网:Apache Tomcat 8 Configuration Reference (8.5.100) - Overview
2.本系列内容是Tomcat的高级内容,需要了解Tomcat的基础知识
3.如果本系列文章有错误,请于评论区指出,会马上修改。