前言:
最近在阅读《Tomcat内核设计剖析》这本书,这里将一些知识点记录下来,以便随时翻阅。本文中讲解的Tomcat,为Tomcat 7。首先我们来大概了解一下Tomcat容器的构成,以此来对Tomcat的工作原理有一个大概的了解,后期会进行详细的记录。
一、容器的整体结构
1、Server 组件
可以说整个容器就是一个Server组件,他可以包含一个和多个Service组件,同时,为了拓展,他引入监听组件Listener,为了集成JNDI,引入了GlobalNamingResources组件。
2、Service组件
Service是服务的抽象,每个Service包含了接收请求的Connector组件,和处理请求的Engine组件,不同的请求协议有不同的Connector(连接器),目前Tomcat支持HTTP协议和AJP协议。此外每个Service还有若干个Executor(线程池)。
3、Connector组件
主要是用来接收客户端的连接,以及请求报文的处理,生成Request对象,Connector的内部实现也根据阻塞I/O和非阻塞I/O分成两种不同的情况,以Http协议为例:
阻塞式I/O结构如下:
3.1、Http11Protocol组件
Http11Protocol组件是基于Http1.1协议版本的抽像,他主要接收客户端的Http请求,处理请求报文,内部包含JioEndPoint组件,该组件内部的Acceptor负责监听端口,并及时将请求放进线程池Exector,Http11Processor组件则从线程池获取请求并封装成Request对象,传递给Engine处理。
3.2、Mapper组件
Mapper组件是客户端请求的路由导航组件,他可以通过请求的地址,找到对应的Servlet.
3.3、CoyoteAdaptor组件
CoyoteAdaptor组件 是一个将连接器Connector和Container容器适配起来的适配器组件。
对于非阻塞式I/O:
他相对阻塞I/O多了一个Poller组件,该组件的任务就是轮询多个客户端,不断检测和处理各种事件。
4、Engine组件
Tomcat有4种级别的容器,Engine,Host,Context,Wrapper,Engine代表全局的Servlet引擎,每个Service组件只能包含一个Engine组件,但是每个Engine组件可以包含多个Host组件,此外,他还包含监听组件,客户端的访问日志组件等。
5、Host组件
Host组件代表虚拟主机,每个虚拟主机可以存放若干个Web应用的抽象(Context容器)。
6、Context组件
Context组件时Web应用的抽象,我们的Web项目被部署到Tomcat之后,会转化成Context对象,他包含各种静态资源,若干Servlet(Wrapper容器)。
7、Wrapper组件
Wrapper容器是Tomcat中级别最小的,他对应Servlet,一个Servlet对应一个Wrapper容器,他包含Servlet组件,ServletPool组件(Servlet对象池),Pipeline组件(Wrapper容器对请求进行处理的管道)。
二、请求处理的过程
上面的过程以阻塞式I/O为例:
2.1:当Tomcat启动之后,Connector容器中的Accptor负责监听客户端的连接,并接收Socket,在接收到socket之后,将其放入线程池;
2.2:Http11Protocol从线程池获取请求信息,并且解析出请求行、请求头、请求体等,并封装成Request对象;
2.3:Mapper组件根据请求行的URL属性,请求头的Host属性匹配由哪个Host容器,哪个Context容器和哪个Wrapper容器来处理请求,这个过程就是从Tomcat中找到对应的Servlet,然后将路由的结果封装大桥哦Request中,方便后面处理时通过Request对象选择容器。
2.4:CoyoteAdaptor组件负责将Connector组件和Engine容器连接起来,把Request对象和Response对象传递到Engine容器,调用它的管道。
2.5:Engine容器的管道开始处理请求,管道里包含若干的阀门,每个阀门负责某些处理逻辑,等所有的阀门执行完之后,才会执行基础阀门EngineValve,它负责调用Host容器的管道。
2.6:Host容器同样包含若干阀门,等所有的阀门执行完之后,才会执行基础阀门HostValve,它会调用Context容器的管道。
2.7:Context容器的各个阀门执行结束之后,调用Wrapper容器的管道。
2.8:Wrapper容器的管道开始处理请求,首先执行基础阀门,然后执行WrapperValve,它会执行容器对应的Servlet的处理方法,对请求逻辑进行处理,并将处理结果输出到客户端。
总结:
本文我们把Tomcat的构成和工作流程梳理了一遍,后面还会对各个组件进行更详细的讲解和记录。DDP