Catalina
catalina使用digester解析XML配置文件并创建应用服务器,生成对应的容器类并启动
Web请求处理总体过程
Tomcat通过Mapper维护了链接与Host、Context、Wrapper等Container的映射,同时通过MapperListener监听所有的Host、Context、Wrapper组件,在相关组件启动、停止时注册或者移除相关映射,此外通过CoyoteAdapter将Mapper和Container联系起来,当Connector接收到请求后,Nio2EndPoint用Processor读取数据,然后调用CoyoteAdapter.service()发放完成请求处理:
- 根据Connector的请求和响应对象创建ServletRequest和SerlvetResponse
- 转换请求参数并完成请求映射(请求URI解码,初始化请求的路径参数;检测URI是否合法,非法则返回响应码400....)
- 得到当前Engine的第一个Valve并执行(invoke),以完成客户端请求处理
- 如果为异步请求(获得请求读取事件监听器(ReadListener),如果请求读取已经结束,出发ReadListenner.onAllDataRead)
- 如果为同步请求(Flush并关闭请求输入六,Flush并关闭响应输出流)
Coyote
Catalina是tomcat提供的Servlet容器的实现,它负责处理来自客户端的请求并输出响应,但是仅有Servlet容器是无法对外提供服务的,还需要链接器接收来自客户端的请求,并按照既定协议如HTTP进行解析,然后交由Servlet容器处理。
Coyote封装了底层的网络通讯,Coyote将Socket输入转换为Request,交由Catalina容器进行处理,处理请求完成后Catalina通过提供的Response对象将结果写入输出流
Tomcat对协议及I/O方式的支持:
应用层:HTTP、JAP、HTTP2
传输层:NIO、NIO2、APR
HTTP请求处理
- 当Connector启动时(BootStrap通过反射实例化一个Catalina,Catalina根据digester解析xml文件并创建应用服务器并注册lifecycle),会同时启动其持有的Endpoint,endpoint并行运行多个线程,每个线程运行一个AbstractEndponit.Acceptor监听端口
- 当监听到请求时会把Socket封装为SocketWrapper并交由SocketProcessor对象处理,异步,此部分根据IO的方式不同会有不同的处理,如NIO采用轮询的方式检测SelectionKey是否就绪,时就获取一个有效的SocketProcessor对象
- SocketProcessor时一个线程池Worker实例,每一个IO均有自己的实现,它首先判断Socket的状态,然后提交到ConnetionHandler处理
- 选择一个合适的Processor进行请求处理
- Processor调用CoyoteAdapter.service方法将其提交到Catalina容器处理.