1、Tomcat的层级结构:
最顶层是一个Server,一个server中有N+个service,一个service中有N+个Connector和1个Container。
2、Tomcat的生命周期管理方式:
Tomcat的Server有org.apache.catalina.startup.Catalina来管理的,也就是说Catalina是整个Tomcat的管理类。它有三个方法:load、start、stop方法。
- load用来根据server.xml来创建Server并调用Server的init初始化方法进行初始化。
- start用来启动服务,其内部调用了Server的start方法。
- stop用来停止服务,其内部调用了Server的stop方法。
这三个方法是会逐级调用的,比如load调用Server的init方法,Server的init方法会(循环)调用Service的init方法,Service的init方法会调用Connector的init方法和Container的init方法。同理于start和stop。
3、Tomcat的入口:在org.apache.catalina.startup.Bootstrap中。这个类的作用相当于一个Catalina类的适配器。便于将入口和具体的管理分开。也便于创建多种启动方式。
4、Tomcat的启动流程:
//todo
//Here is a picture to show Tomcat's start-flow。
5、Lifecycle接口是Tomcat用来统一管理生命周期的。
6、Container的结构:
一个Container只包含一个Engine(引擎),一个Engine中包含N+个Host(主机),一个Host中包含N+个Context(应用),一个Context中包含N+个Wrapper,每个Wrapper中封装了以个Servlet。
//todo
//Here is a picture to show Container's struction。
Context和Host的区别: Context代表一个应用,比如webapps下每个目录都是一个应用,其中ROOT放着主应用,其他目录放着子应用,而整个webapps是一个站点。假如www.aaa.com域名对应着webapps目录所代表的站点,其中ROOT目录可以使用域名直接访问:www.aaa.com;而webapps/test对应的是子应用test,访问使用www.aaa.com/test。
7、Container中4个容器的配置方法:
<!-- 以下是一段简短的配置,仅用来说明部分容器中的属性意义 -->
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Alias>xxx.com</Alias>
</Host>
</Engine>
Engine中的defaultHost指如果请求的域名在所有应用中找不到时,采用这个域名。
Host中的name为域名,appBase指该站点对应的应用位置,unpackWARs是是否自动解压WAR包,autoDeploy指是否自动部署。Alias是别名,指xxx.com和localhost具有同等效果。
Context的配置方法:
- 通过文件配置;
- 将WAR应用放到Host对应的目录下,Tomcat自动解压;
- 将应用的文件夹放到Host目录下,Tomcat会自动查找并添加到Host中。
Context通过文件配置一共有5个地方可以配置:
1. conf/server.xml中Context标签;
2. conf/[enginename]/[hostname]/目录下以应用命名的xml文件。
3. 应用自己的/META_INF/context.xml文件。
4. conf/context.xml文件。
5. conf/[enginename]/[hostname]/context.xml.default 文件。
前三个是用于配置单独的应用,后两个配置的Context是共享的,conf/context.xml文件中配置的内容在整个Tomcat中共享,第5种配置在对应的站点(Host)中共享。
8、Container的启动:
- 在start时才校验是否init。
- Context和Wrapper是动态添加到对应的容器的。
9、Container是采用Pipeline-Vavle处理模式(责任链模式)来处理请求的。即一个请求会多个处理者来依次进行处理,每个处理者只负责自己的部分,处理完成后返回请求,并递交给下一个处理者。
- 在每一个上层容器的BaseVavle中会调用下一个容器的处理。
10、Connector用于接收并将请求按照HTTP协议封装成Request和Response来处理。最底层采用Socket来进行连接。
请求最先经过Connector,封装成对应HTTPRequest和HTTPResponse,转交给Container,Container处理完之后,把结果交给Connector,Connector使用Socket将结果返回给客户端。