tomcat的工作流程:
1、Tomcat是运行在JVM中的一个进程。它定义为“中间件”,顾名思义是一个在Java项目与JVM之间的中间容器。
2、Web项目的本质,是一大堆的资源文件和方法。Web项目没有入口方法(即main方法),这意味着Web项目中的方法不会自动运行起来。
Web项目部署进Tomcat的webapp中的目的是很明确的,那就是希望Tomcat去调用写好的方法去为客户端返回需要的资源和数据。
3、Tomcat可以运行起来,并调用写好的方法。那么,Tomcat一定有一个main方法。对于Tomcat而言,它并不知道用户会有什么样的方法,这些都只是在项目被部署进webapp下后才确定的。由此可知,Tomcat是用Java的反射来实现类的动态加载、实例化、获取方法、调用方法。但是部署到Tomcat中的Web项目必须是按照规定好的接口来进行编写,以便进行调用。
tomcat核心组件:coyote(connector),catalina(container)
1.connector框架——coyote 1.1.connector核心功能一、监听网络端口,接收和响应网络请求。
二、网络字节流处理。将收到的网络字节流转换成 Tomcat Request 再转成标准的 ServletRequest 给容器,同时将容器传来的 ServletResponse 转成 Tomcat Response 再转成网络字节流。
1.2.设计connector需要一个通讯端点来监听端口;需要一个处理器来处理网络字节流;最后还需要一个适配器将处理后的结果转成容器需要的结构。
| 组件 | 功能 |
|---|---|
| Endpoint | 端点,用来处理 Socket 接收和发送的逻辑。其内部由 Acceptor 监听请求、Handler 处理数据、AsyncTimeout 检查请求超时。具体的实现有 NioEndPoint、AprEndpoint 等。 |
| Processor | 处理器,负责构建 Tomcat Request 和 Response 对象。具体的实现有 Http11Processor、StreamProcessor 等。 |
| Adapter | 适配器,实现 Tomcat Request、Response 与 ServletRequest、ServletResponse之间的相互转换。这采用的是经典的适配器设计模式。 |
| ProtocolHandler | 协议处理器,将不同的协议和通讯方式组合封装成对应的协议处理器,如 Http11NioProtocol 封装的是 HTTP + NIO。 |
源码包路径:org.apache.coyote
结构图:
2.container框架——catalina 2.1.container结构
每个 Service 会包含一个容器。容器由一个引擎可以管理多个虚拟主机。每个虚拟主机可以管理多个 Web 应用。每个 Web 应用会有多个 Servlet 包装器。Engine、Host、Context 和 Wrapper,四个容器之间属于父子关系。
| 容器 | 功能 |
|---|---|
| Engine | 引擎,管理多个虚拟主机。 |
| Host | 虚拟主机,负责 Web 应用的部署。 |
| Context | Web 应用,包含多个 Servlet 封装器。 |
| Wrapper | 封装器,容器的最底层。对 Servlet 进行封装,负责实例的创建、执行和销毁功能。 |
源码包路径:org.apache.catalina
结构图:
2.2.处理请求容器的请求处理过程就是在 Engine、Host、Context 和 Wrapper 这四个容器之间层层调用,最后在 Servlet 中执行对应的业务逻辑。各容器都会有一个通道 Pipeline,每个通道上都会有一个 Basic Valve(如StandardEnginevalve), 类似一个闸门用来处理 Request 和 Response 。
流程图:
参考
分析Tomcat的工作原理



