Tomcat的核心组件
Tomcat将请求器和处理器分离,使用多种请求器支持不同的网络协议,而处理器只有一个。从而网络协议和容器解耦。
Tomcat的容器
Host:Tomcat提供多个域名的服务,其将每个域名都视为一个虚拟的主机,在每个虚拟主机下包含多个web应用。
Context:一个应用的上下文。一个虚拟主机(域名)下可以有多个应用。
Wrapper:Servlet的包装类。
Tomcat使用责任链来实现客户端的请求处理。
Pipeline和Value
Engine,Host,Context,Wrapper共用一个pipeline实例,各自在自己的层面上又都实现了独属于自己的Value处理器。
-
责任链模式:Tomcat使用责任链模式,将请求处理流程划分为一系列阶段。每个阶段由相应组件的管道负责,形成一个责任链。当一个请求到达时,它会依次经过责任链中的每个阶段,每个阶段都有机会对请求进行处理。
-
各组件的处理阶段:每个组件(Engine、Host、Context、Wrapper)的管道定义了它们感兴趣的处理阶段,并在相应的阶段中执行特定的逻辑。这样,每个组件都能够在请求处理过程的不同阶段执行自己的操作。
-
共享的Pipeline:尽管整个请求处理流程共用一个管道,但在责任链的每个阶段,可以通过判断当前处理的组件来确定是否执行该组件的处理逻辑。这样,每个组件在其关心的阶段会执行相应的操作,而在其他阶段则会跳过。
在Connector启动后Endpoint会启动线程来监听服务器端口,并且在接收到请求后调用Processor来进行数据读取。
Mapper和MapperListener
当Processor读取到客户端请求后,会按照请求地址映射到相应的容器处理。
Mapper用于按照映射规则查找容器,MapperListener用于监听容器变化,当容器卸载或者注册,会变更容器信息。
Tomcat的请求处理
应用服务器的请求处理开始于监听socket端口接收到的命令,结束于将服务器的处理结果写入socket输出流。
Connector将请求按照既定协议读取,并且将其封装为与协议无关的对象,通过Mapper映射给处理的Servlet进行处理,Servlet生成处理结果,并且将其写入socket输出流中。
Engine,Host,Context共用一个pipeline,执行的也是一个pipeline,只不过value包含有其归属的属性,执行Engine的pipeline时,只执行属于Engine的value
执行流程:
- Endpoint的socket监听到消息,接收消息
- Process处理消息,封装对象
- Mapper根据请求地址将消息对象传递给对应容器
- Engine执行其pipeline中的value
- Host执行其pipeline中的value
- Context执行其pipeline中的value
- wrapper执行其pipeline中的value
- filterchain执行过滤器
- 交给servlet处理