02. Tomcat 请求流程解析
2022-03-20 13:56:15 0 举报
AI智能生成
Tomcat是一个用于部署Web应用的Web服务器和Servlet容器。当客户端发送请求到Tomcat服务器时,它会按照以下流程进行处理: 1. 客户端向Tomcat服务器发送HTTP请求。 2. Tomcat服务器接收到请求后,会先检查请求的资源是否存在。如果不存在,则返回404错误。 3. 如果请求的资源存在,则Tomcat服务器会将请求交给对应的Servlet来处理。Servlet会根据请求的内容生成响应,并将响应发送回客户端。 4. Tomcat服务器还会负责管理Servlet的生命周期,包括初始化、运行和销毁等阶段。
作者其他创作
大纲/内容
Acceptor<br>一直接收 8080 端口的请求<br>
endpoint.serverSocketAccept()<br>调用 NIO 的方法获取 serverSocket 对象<br>这个方法是阻塞的
endpoint.setSocketOptions(socket)<br>处理请求
nioChannels.pop()<br>获取 channel 对象
包装成 socketWrapper 对象<br>
poller.register(socketWrapper)<br>调用注册方法
event.reset(socketWrapper, OP_REGISTER)<br>将事件重置为注册状态
addEvent(event)<br>添加事件到队列中
events.offer(event)<br>注意它是一个 SynchronizedQueue 同步阻塞队列
Poller<br>消费队列
events()<br>死循环消费数据
events.poll()<br>从队列中获取数据
processKey(sk, socketWrapper)<br>真正处理方法
unreg(sk, socketWrapper, sk.readyOps())<br>防止重复读取 socket 中的数据
processSocket(socketWrapper, SocketEvent.OPEN_READ, true)<br>继续处理事件
createSocketProcessor(socketWrapper, event)<br>创建一个 SocketProcessorBase 处理器
getExecutor()<br>获取 worker 线程池
executor.execute(sc)<br>处理 SocketProcessorBase
SocketProcessorBase<br>它实现了 Runnable 接口
doRun()<br>在 run() 方法里调用它处理
getHandler()<br>获取 handler 处理器<br>这里是【AbstractProtocol.ConnectionHandler】对象
process(socketWrapper, event)<br>调用 handler 的 process() 方法
getProtocol().createProcessor()<br>创建 processor 处理器<br>这里是【Http11Processor】对象
processor.process(wrapper, status)<br>使用 processor 处理数据
service(socketWrapper)<br>继续调用
prepareRequest()<br>校验请求头相关的参数
getAdapter().service(request, response)<br>调用【CoyoteAdapter】的 service() 方法处理请求
CoyoteAdapter<br>将请求与 Tomcat 自己的处理流程标准适配
service()<br>真正的处理请求逻辑
把 coyote 的 Request 转成 Servlet 规范的 Request并完成初始化赋值
把 coyote 的 Response 转成 Servlet 规范的 Response并完成初始化赋值<br>
connector.getService().getContainer().getPipeline().getFirst().invoke(request, response)<br>调用 container 的 pipeline 的第一个 valve 的 invoke() 方法<br>这里是【StandardEngineValve】组件
host.getPipeline().getFirst().invoke(request, response)<br>调用 host 的 pipeline 的第一个 valve 的 invoke() 方法<br>这里会循环调用所有的 Valve 组件<br>【AccessLogValve】> 【ErrorReportValve】>【StandardHostValve】<br>
context.getPipeline().getFirst().invoke(request, response)<br>调用 context 的 pipeline 的第一个 valve 的 invoke() 方法<br>这里会循环调用所有的 Valve 组件<br>【NonLoginAuthenticator】> 【StandardContextValve】<br>
wrapper.getPipeline().getFirst().invoke(request, response)<br>调用 context 的 pipeline 的第一个 valve 的 invoke() 方法<br>这里是【StandardWrapperValve】组件
wrapper.allocate()<br>使用 wrapper 创建一个 Servlet 对象
loadServlet()<br>利用反射创建好 Servlet 对象
initServlet(servlet)<br>完成 Servlet 的初始化工作<br>就是调用 init() 方法
ApplicationFilterFactory.createFilterChain(request, wrapper, servlet)<br>为当前请求准备 Filter 过滤器链
filterChain.doFilter(request.getRequest(), response.getResponse())<br>先执行过滤器链的 doFilter() 方法
internalDoFilter(request,response)<br>继续执行
filter.doFilter(request, response, this)<br>获取容器中的所有 Filter,挨个调用 doFilter() 方法
servlet.service(request, response)<br>调用 servlet 的 service() 方法处理请求
0 条评论
下一页