一.概述
如果将tomcat内核高度抽象,则它可以看成由连接器(Connector)组件和容器(Container)组件组成,其中Connector组件负责在服务器端处理客户端链接,包括接受客户端链接、接受客户端的消息报文以及消息报文的解析工作,而Container组件负责对客户端的请求进行逻辑处理,并把结果返回给客户端,包括四个级别的容器:Engine组件、Host组件、Context组件和Wrapper组件。容器也是整个tomcat的核心。
1.Server组件
Server是最顶级的组件,代表Tomcat的运行实例,在一个JVM中只会包含一个。在Server的整个生命周期中,不同阶段会有不同的事情发生,为了方便扩展,它引入了监听器的方式,所以它也包含了Listener组件,为了方便集成JNDI,引入了GlobalNamingResource组件,同时也包含了Service核心组件。
2.Service组件
Service是服务的抽象,它代表请求从接收到处理的所有组件的集合。设计上Server可以包含多个Service组件,每个Service组件都包含若干用于接收客户端消息的Connector组件和用于处理请求的Engine组件。不同的Connector组件使用不同的通信协议(Http、AJP)若干Connector组件和一个客户端请求处理组件Engine组成的集合即为Service.Service组件还包含了若干Executor组件,每个Executor都是一个线程池,它可以为Service内所有组件提供线程池执行任务。
3.Connector组件
Connector主要职责是接受客户端链接并接受消息报文,消息报文经由它解析后送往容器中处理
4.Engine组件
Tomcat内部有4个级别的容器,分别是Engine、Host、Context和Wrapper
Engine代表全局Servlet引擎。每个Service组件只能包含一个Engine容器组件,但Engine组件可以包含若干Host容器组件
还包括Listener组件:在Tomcat生命周期中完成某些Engine容器相关工作的监听
AccessLog组件:客户端的访问日志,所有客户端访问都会被记录
Cluster组件:它提供集群功能,将Engine容器需要共享的数据同步到集群中的其他Tomcat实例上
Pipeline组件:Engine容器对请求进行处理的管道。
5.Host组件
Tomcat中Host组件代表是虚拟主机,这些虚拟主机可以存放若干Web应用的抽象(Context容器)。除了Context组件外,还包括
Listener组件:在Tomcat生命周期中完成某些Engine容器相关工作的监听
AccessLog组件:客户端的访问日志,所有客户端访问都会被记录
Cluster组件:它提供集群功能,将Engine容器需要共享的数据同步到集群中的其他Tomcat实例上
Pipeline组件:Host容器对请求进行处理的管道。
6.Context组件
Context组件是Web应用的抽象,开发的Web应用部署到Tomcat后运行就会转化成Context对象。主要包含了各种静态资源、若干Servlet以及各种其他动态资源
Listener组件:在Tomcat生命周期中完成某些Engine容器相关工作的监听
AccessLog组件:客户端的访问日志,所有客户端访问都会被记录
7.Wrapper组件
Wrapper容器是Tomcat中4个级别的容器中最小的,与之对应的是Servlet,一个Wrapper对应一个Servlet,主要包括
Servlet组件:Servlet即Web应用开发常用的Servlet,我们会在Servlet中编写好请求的逻辑处理。
①Tomcat启动后,Connector组件的接收器(Acceptor)将会监听是否有客户端套接字连接并接受Socket
②监听到客户端连接,将连接交给线程池Executor处理,开始执行请求响应任务
③HttpllProcessor组件负责从客户端连接中读取消息报文,然后解析HTTP的请求行、请求头部、请求体。将解析后的报文组装成Request对象,方便日后通过Request对象
获取HTTP协议的相关值
④Mapper组件根据HTTP协议请求行的URL属性值和请求头部的Host属性值匹配由哪个Host容器、哪个Context容器。哪个Wrapper容器处理请求。就是根据请求从Tomcat
中找到对应的Servlet。然后将结果保存到Request对象中,方便后面处理时通过Request对象选择容器
⑤CoyoteAdaptor组将负责将Connector组件和Engine容器链接起来,把处理过程生成的Request和Response传递到Engine容器,调用他的管道。
⑥Engine容器的管道开始处理请求,管道包含若干阀门(Value),每个阀门负责某些处理逻辑。用xxxvalue代表阀门,可以根据自己的需要往这个阀门中添加多个阀门,首先
执行这个xxxValue,然后才执行基础阀门EngineValue,负责调用Host容器的管道
⑦Host容器的管道开始处理请求,首先执行这些阀门,然后执行基础阀门HostValue,他继续往下调用Context容器的管道
⑧Context容器的管道开始处理请求,首先执行这些阀门,然后执行基础阀门ContextValue,他继续往下调用Wrapper容器的管道
⑨Wrapper容器的管道开始处理请求,首先执行这些阀门,然后执行基础阀门WrappertValue,它会执行该Wrapper容器对应的Servlet对象的处理方法,对请求进行逻辑处理,将结果输出到客户端