tomcat 容器的组成

1.tomcat 请求映射

tomcat 容器的组成

2.tomcat组件的介绍

tomcat 容器的组成

1.Server组件

  Server是最*的组件 ,它代表Tomcat的运行实例,在 一个JVM中只会包含一个Server。在Server的整个生命周期总,不同阶段会有不同的事情要完成。

2.Service组件

Service是 服务的抽象,它代表请求从接收到处理的所有组件的集合,

tomcat 容器的组成

在设计上Server组件可以包含多个Service组件,每个Service组件都包含了若干个用于接收客户端 消息的Connector组件和处理请求的Engine组件。其中不同的Connector组件使用不同的通信 协议,如HTTP协议和AJP协议,还可以使用其他的协议。service组件还包含若干个Executor组件,每geExecutor都是一个线程池,它可以为Service内所有组件提供线程池执行任务。

3.Connector组件

主要职责是接收客户端请求并接收请求消息报文,消息报文经由它解析后送往容器容器中处理,

因为存在不同的通信协议,例如HTTP协议、AJP协议等,所以我们需要不同的 Connector组件,每种协议对应一个Connector组件,目前TOmcat包含HTTP和AJP良好总协议的Connector.

阻塞式的Connector结构如下:

tomcat 容器的组成

1. Http11Protocol组件,是HTTP协议1.1 版本的抽象,它包含客户端连接、接收客户端消息报文、报文解析处理、对客户端响应等整个过程。它主要包含JIoEndpoint组件和Http11Processor,启动时,JIoEndpoint组件内部的Acceptor组件将启动某个端口的监听,一个请求到来后将被扔进线程池Executor,线程池进行任务处理处理,处理过程中将通过Http11Processor组件对HTTP协议解析并传递到Engine容器继续处理。

2.Mapper组件,可以通过请求地址找到对应的servlet

3.CoyoteAdapter组件,将一个Connect和Container适配起来的适配器。


非阻塞式的Connector结构如下:

tomcat 容器的组成

非阻塞式多了一个poller组件:

poller组件:在非阻塞I/O方式下轮询多个客户端连接,不断检测,处理各种事件,例如不断检测各个连接是否可读,对于可读的客户端连接尝试进行读取并解析消息报文

4.Engine 组件

  Connector把封装了Request对象以及Response对象的Socket传递给了Container容器,那么在Contianer容器中又是怎么样的处理流程呢?在说Container容器之前,有必要对Container容器有一个简单的了解,Container容器是子容器的父接口,所有的子容器都必须实现这个接口,在Tomcat中Container容器的设计是典型的责任链设计模式,其有四个子容器:Engine、Host、Context和Wrapper。这四个容器之间是父子关系,Engine容器包含Host,Host包含Context,Context包含Wrapper。

我们在web项目中的一个Servlet类对应一个Wrapper,多个Servlet就对应多个Wrapper,当有多个Wrapper的时候就需要一个容器来管理这些Wrapper了,这就是Context容器了,Context容器对应一个工程,所以我们新部署一个工程到Tomcat中就会新创建一个Context容器。

tomcat 容器的组成

2.tomcat请求执行流程如下:

tomcat 容器的组成


1.Http11Processor组件负责从客户端连接中读取消息报文,然后开始解析HTTP的请求行、请求头部、请求体。将解析后的报文封装成Request对象,方面后面处理时通过request对象获取HTTP协议的相关值。

2.Mapper组件根据HTTP协议请求行的URL属性值和请求头部的Host属性值匹配由哪个Host容器、哪个Context、哪个Wrapper容器处理请求,这个过程其实是根据请求从Tomcat中找到对应的Servlet。然后将路由封装到Request对象中,方面后面处理时通过Request对象选择容器。

3.CoyoteAdapter 组件负责将Connector组件和Engine容器连接起来,把前面处理过程中生成的请求对象Request和响应对象Response传递到Engine容器,调用它的通道。

4.Engine容器的管道开始处理请求,管道里包含若干个阀门(value),每个阀门负责某些逻辑处理。这里用xxxValue代表某阀门,我们可以根据自己的需要往这个管道中添加多个饭呢,首先执行这个xxxValue,然后才执行基础阀门EngineValue,它会负责调用Host容器的管道。

5.Host容器的管道开始处理请求,它同样也包含若干阀门,然后执行基础阀门HostValue,它负责调用Context容器的管道。

6.Context容器的管道开始处理请求,它同样也包含若干阀门,然后执行基础阀门ContextValue,它负责调用Wrapper容器的管道。

7.Wrapper 容器的管道开始处理请求,它同样也包含若干阀门,然后执行基础阀门Wrapper Value,它负责调用Wrapper容器的管道。它会执行该Wrapper容器对应的Serlet对象的处理方法,对请求进行逻辑处理,并将结果输出到客户端。