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
一直接收 8080 端口的请求
一直接收 8080 端口的请求
endpoint.serverSocketAccept()
调用 NIO 的方法获取 serverSocket 对象
这个方法是阻塞的
调用 NIO 的方法获取 serverSocket 对象
这个方法是阻塞的
endpoint.setSocketOptions(socket)
处理请求
处理请求
nioChannels.pop()
获取 channel 对象
获取 channel 对象
包装成 socketWrapper 对象
poller.register(socketWrapper)
调用注册方法
调用注册方法
event.reset(socketWrapper, OP_REGISTER)
将事件重置为注册状态
将事件重置为注册状态
addEvent(event)
添加事件到队列中
添加事件到队列中
events.offer(event)
注意它是一个 SynchronizedQueue 同步阻塞队列
注意它是一个 SynchronizedQueue 同步阻塞队列
Poller
消费队列
消费队列
events()
死循环消费数据
死循环消费数据
events.poll()
从队列中获取数据
从队列中获取数据
processKey(sk, socketWrapper)
真正处理方法
真正处理方法
unreg(sk, socketWrapper, sk.readyOps())
防止重复读取 socket 中的数据
防止重复读取 socket 中的数据
processSocket(socketWrapper, SocketEvent.OPEN_READ, true)
继续处理事件
继续处理事件
createSocketProcessor(socketWrapper, event)
创建一个 SocketProcessorBase 处理器
创建一个 SocketProcessorBase 处理器
getExecutor()
获取 worker 线程池
获取 worker 线程池
executor.execute(sc)
处理 SocketProcessorBase
处理 SocketProcessorBase
SocketProcessorBase
它实现了 Runnable 接口
它实现了 Runnable 接口
doRun()
在 run() 方法里调用它处理
在 run() 方法里调用它处理
getHandler()
获取 handler 处理器
这里是【AbstractProtocol.ConnectionHandler】对象
获取 handler 处理器
这里是【AbstractProtocol.ConnectionHandler】对象
process(socketWrapper, event)
调用 handler 的 process() 方法
调用 handler 的 process() 方法
getProtocol().createProcessor()
创建 processor 处理器
这里是【Http11Processor】对象
创建 processor 处理器
这里是【Http11Processor】对象
processor.process(wrapper, status)
使用 processor 处理数据
使用 processor 处理数据
service(socketWrapper)
继续调用
继续调用
prepareRequest()
校验请求头相关的参数
校验请求头相关的参数
getAdapter().service(request, response)
调用【CoyoteAdapter】的 service() 方法处理请求
调用【CoyoteAdapter】的 service() 方法处理请求
CoyoteAdapter
将请求与 Tomcat 自己的处理流程标准适配
将请求与 Tomcat 自己的处理流程标准适配
service()
真正的处理请求逻辑
真正的处理请求逻辑
把 coyote 的 Request 转成 Servlet 规范的 Request并完成初始化赋值
把 coyote 的 Response 转成 Servlet 规范的 Response并完成初始化赋值
connector.getService().getContainer().getPipeline().getFirst().invoke(request, response)
调用 container 的 pipeline 的第一个 valve 的 invoke() 方法
这里是【StandardEngineValve】组件
调用 container 的 pipeline 的第一个 valve 的 invoke() 方法
这里是【StandardEngineValve】组件
host.getPipeline().getFirst().invoke(request, response)
调用 host 的 pipeline 的第一个 valve 的 invoke() 方法
这里会循环调用所有的 Valve 组件
【AccessLogValve】> 【ErrorReportValve】>【StandardHostValve】
调用 host 的 pipeline 的第一个 valve 的 invoke() 方法
这里会循环调用所有的 Valve 组件
【AccessLogValve】> 【ErrorReportValve】>【StandardHostValve】
context.getPipeline().getFirst().invoke(request, response)
调用 context 的 pipeline 的第一个 valve 的 invoke() 方法
这里会循环调用所有的 Valve 组件
【NonLoginAuthenticator】> 【StandardContextValve】
调用 context 的 pipeline 的第一个 valve 的 invoke() 方法
这里会循环调用所有的 Valve 组件
【NonLoginAuthenticator】> 【StandardContextValve】
wrapper.getPipeline().getFirst().invoke(request, response)
调用 context 的 pipeline 的第一个 valve 的 invoke() 方法
这里是【StandardWrapperValve】组件
调用 context 的 pipeline 的第一个 valve 的 invoke() 方法
这里是【StandardWrapperValve】组件
wrapper.allocate()
使用 wrapper 创建一个 Servlet 对象
使用 wrapper 创建一个 Servlet 对象
loadServlet()
利用反射创建好 Servlet 对象
利用反射创建好 Servlet 对象
initServlet(servlet)
完成 Servlet 的初始化工作
就是调用 init() 方法
完成 Servlet 的初始化工作
就是调用 init() 方法
ApplicationFilterFactory.createFilterChain(request, wrapper, servlet)
为当前请求准备 Filter 过滤器链
为当前请求准备 Filter 过滤器链
filterChain.doFilter(request.getRequest(), response.getResponse())
先执行过滤器链的 doFilter() 方法
先执行过滤器链的 doFilter() 方法
internalDoFilter(request,response)
继续执行
继续执行
filter.doFilter(request, response, this)
获取容器中的所有 Filter,挨个调用 doFilter() 方法
获取容器中的所有 Filter,挨个调用 doFilter() 方法
servlet.service(request, response)
调用 servlet 的 service() 方法处理请求
调用 servlet 的 service() 方法处理请求
0 条评论
下一页