整体架构

Service
对外提供Web服务, 主要包含连接器和容器, 以及其他的功能组件. Tomcat可以管理多个Service, 各个Service之间相互独立
Connector
负责对外接受反馈请求. 是Tomcat与外界的交通枢纽, 监听端口接受外界请求, 将处理后的请求传递给容器做业务处理, 将处理后的结果反馈给外界
连接器框架—Coyote(草原狼)
功能:
- 监听网络端口, 接受和响应网络请求
- 网络字节流处理
- 网络字节流->Tomcat Request->ServletRequest
- ServletResponse->Tomcat Response->网络字节流
ProtocolHandler
协议处理器. 将不同的协议和通信方式组合封装成对应的协议处理器, Http11NioProtocol就是Http+Nio
Endpoint
端点. 处理Socket接受和发送的逻辑.包括如下组件
- Acceptor监听请求
- Handler处理请求
-
Processor
处理器. 负责构建Tomcat Request和Tomcat Response对象
Adapter
适配器. 实现Tomcat Request->ServletRequest和Tomcat Response->ServletResponse的转换. 采用经典的适配器设计模式
Container
负责对内业务逻辑处理. 内部由Engine, Host, Context, Wrapper四个容器组成, 管理和调用Servlet逻辑
核心框架—Catalina
每一个Service都有一个容器, 一个容器由一个Engine管理多个Host, 每个Host管理多个Web应用, 每个Web应用有多个Servlet封装器.

Engine: 引擎 管理多个Host
- Host: 虚拟主机 负责Web应用的部署
- Context: Web应用 包含多个Servlet封装器
- Wrapper: 封装器, 最底层, 对Servlet封装, 负责实例的创建, 执行和销毁功能
容器处理过程如下
每一个组件中都有一个Valve来处理Request和Response, 图片中错误
Tomcat的请求流程
Mapper—请求路径匹配对应的虚拟站点
提供请求路径的路由映射, 根据URL地址匹配哪个容器处理. 每个Container都有自己Mapper.
HTTP请求流程
打开 tomcat/conf 目录下的 server.xml 文件来分析一个http://localhost:8080/docs/api 请求。 第一步:连接器监听的端口是8080。由于请求的端口和监听的端口一致,连接器接受了该请求。 第二步:因为引擎的默认虚拟主机是 localhost,并且虚拟主机的目录是webapps。所以请求找到了 tomcat/webapps 目录。 第三步:解析的 docs 是 web 程序的应用名,也就是 context。此时请求继续从 webapps 目录下找 docs 目录。有的时候我们也会把应用名省略。 第四步:解析的 api 是具体的业务逻辑地址。此时需要从 docs/WEB-INF/web.xml 中找映射关系,最后调用具体的函数。
