本系列都是基于tomcat8.5.53
组成
tomcat是一个webServer服务器,里面的核心组件是Server,server是由多个service组成,每个service主要有Connector(连接器),Container(容器),Mapper(管理connectort与容器的关系)这3个组件
Container 容器
tomcat中的容器分为engine,Host,Context,Wrapper(Servlet)他们之间是包含关系层层递进,engine的子容器是host,host的子容器是context,context的子容器是wrapper。
对于每一个service而言,他只有一个engine,但是一个engine可以有多个context
Engine
对于一个service而言有且只有有一个engine
Host
对于一个engine而言可以有多个host,而每个host又可以有他们各自的Context,默认的Host为localhost
Context
context 实际上就是我们的一个webApp应用了
Wrapper
wrapper实际上就是对我们的servlet的一个封装,FilterChain就是通过Wrapper实现的。
Connector连接器
名称 | 作用 |
---|---|
Endpoint | 监听请求 |
ProtocolHandler | 根据不同类型的协议获取processor |
Processor | 处理请求 |
CoyoteAdapter | 封装请求对象,并且根据mapper找到对应的host,context,wrapper |
Endpoint
endpoint的主要作用是监听请求,其中主要包含Acceptor,Poller,Processor(Worker) 3个角色,在这个类里面实现了对请求的包装和分发。
角色名 | 作用 |
---|---|
Acceptor | 监听请求 |
Poller | 包装请求、选择处理这个请求的Processor |
Processor | 处理请求,注意 这里的Processor是SocketProcessorBase的子类实现而不是上图中ProtocolHandler选择的processor |
ProtocolHandler
从名字上我们就可以看出这个类的作用,协议处理器,对于不同的协议是需要不同的Processor来处理的,ProtocolHandler的作用就是根据当前包装的请求找到对应的Processor。
Processor
针对于不同的协议此类又不同的实现类,它主要的作用是根据协议做一些对应的处理,封装请求(org.apache.coyote.Request)和响应对象(org.apache.coyote.Response),处理完毕后此类里面实现了通过CoyoteAdapter传递请求到对应的容器中。
CoyoteAdapter
这个适配器中干的事情就比较重要了,
- 将processor中封装的org.apache.coyote.Request 和org.apache.coyote.Response封装为我们熟悉的HttpServletRequest和HttpServletResponse
- 根据当前的connector找到对应的service,根据service中的mapper对象找到此次请求需要调用的host、context、wrapper容器
- 根据找到的Engine的PipeLine开始层层调用。具体的流程过于复杂,在后面的章节再详细描述