2021-06-23

面试官:谈谈 Tomcat 请求处理流程,我一脸懵逼。。

来源:github.com/c-rainstorm/blog/blob/master/tomcat/

很多东西在时序图中体现的已经非常清楚了,没有必要再一步一步的作介绍,所以本文以图为主,然后对部分内容加以简单解释。

绘制图形使用的工具是 PlantUML + Visual Studio Code + PlantUML Extension

本文对 Tomcat 的介绍以 Tomcat-9.0.0.M22 为标准。

https://tomcat.apache.org/tomcat-9.0-doc/index.html

Overview

Connector 启动以后会启动一组线程用于不同阶段的请求处理过程。

  1. Acceptor 线程组。用于接受新连接,并将新连接封装一下,选择一个 Poller 将新连接添加到 Poller 的事件队列中。
  2. Poller 线程组。用于监听 Socket 事件,当 Socket 可读或可写等等时,将 Socket 封装一下添加到 worker 线程池的任务队列中。
  3. worker 线程组。用于对请求进行处理,包括分析请求报文并创建 Request 对象,调用容器的 pipeline 进行处理。

Acceptor、Poller、worker 所在的 ThreadPoolExecutor 都维护在 NioEndpoint 中。

Connector Init and Start

  1. initServerSocket(),通过 ServerSocketChannel.open() 打开一个 ServerSocket,默认绑定到 8080 端口,默认的连接等待队列长度是 100, 当超过 100 个时会拒绝服务。我们可以通过配置 conf/server.
  2. createExecutor() 用于创建 Worker 线程池。默认会启动 10 个 Worker 线程,Tomcat 处理请求过程中,Woker 最多不超过 200 个。我们可以通过配置 conf/server.
  3. Pollor 用于检测已就绪的 Socket。 默认最多不超过 2 个,Math.min(2,Runtime.getRuntime().availableProcessors());。我们可以通过配置 pollerThreadCount 来定制。
  4. Acceptor 用于接受新连接。默认是 1 个。我们可以通过配置 acceptorThreadCount 对其进行定制。

Requtst Process

Acceptor

  1. Acceptor 在启动后会阻塞在 ServerSocketChannel.accept(); 方法处,当有新连接到达时,该方法返回一个 SocketChannel。
  2. 配置完 Socket 以后将 Socket 封装到 NioChannel 中,并注册到 Poller,值的一提的是,我们一开始就启动了多个 Poller 线程,注册的时候,连接是公平的分配到每个 Poller 的。NioEndpoint 维护了一个 Poller 数组,当一个连接分配给 pollers[index] 时,下一个连接就会分配给 pollers[(index+1)%pollers.length].
  3. addEvent() 方法会将 Socket 添加到该 Poller 的 PollerEvent 队列中。到此 Acceptor 的任务就完成了。

Poller

  1. selector.select(1000)。当 Poller 启动后因为 selector 中并没有已注册的 Channel,所以当执行到该方法时只能阻塞。所有的 Poller 共用一个 Selector,其实现类是 sun.nio.ch.EPollSelectorImpl
  2. events() 方法会将通过 addEvent() 方法添加到事件队列中的 Socket 注册到 EPollSelectorImpl,当 Socket 可读时,Poller 才对其进行处理
  3. createSocketProcessor() 方法将 Socket 封装到 SocketProcessor 中,SocketProcessor 实现了 Runnable 接口。worker 线程通过调用其 run() 方法来对 Socket 进行处理。
  4. execute(SocketProcessor) 方法将 SocketProcessor 提交到线程池,放入线程池的 workQueue 中。workQueue 是 BlockingQueue 的实例。到此 Poller 的任务就完成了。

Worker

  • worker 线程被创建以后就执行 ThreadPoolExecutor 的 runWorker() 方法,试图从 workQueue 中取待处理任务,但是一开始 workQueue 是空的,所以 worker 线程会阻塞在 workQueue.take() 方法。
  • 当新任务添加到 workQueue后,workQueue.take() 方法会返回一个 Runnable,通常是 SocketProcessor,然后 worker 线程调用 SocketProcessor 的 run() 方法对 Socket 进行处理。
  • createProcessor() 会创建一个 Http11Processor, 它用来解析 Socket,将 Socket 中的内容封装到 Request 中。注意这个 Request 是临时使用的一个类,它的全类名是 org.apache.coyote.Request,
  • postParseRequest() 方法封装一下 Request,并处理一下映射关系(从 URL 映射到相应的 Host、Context、Wrapper)。
  1. CoyoteAdapter 将 Rquest 提交给 Container 处理之前,并将 org.apache.coyote.Request 封装到 org.apache.catalina.connector.Request,传递给 Container 处理的 Request 是 org.apache.catalina.connector.Request。
  2. connector.getService().getMapper().map(),用来在 Mapper 中查询 URL 的映射关系。映射关系会保留到 org.apache.catalina.connector.Request 中,Container 处理阶段 request.getHost() 是使用的就是这个阶段查询到的映射主机,以此类推 request.getContext()、request.getWrapper() 都是。
  • connector.getService().getContainer().getPipeline().getFirst().invoke() 会将请求传递到 Container 处理,当然了 Container 处理也是在 Worker 线程中执行的,但是这是一个相对独立的模块,所以单独分出来一节。

Container原文转载:http://www.shaoqun.com/a/824687.html

跨境电商:https://www.ikjzd.com/

中国邮政邮乐网:https://www.ikjzd.com/w/1776

dmm.adult:https://www.ikjzd.com/w/2026

折扣网站:https://www.ikjzd.com/w/74


来源:github.com/c-rainstorm/blog/blob/master/tomcat/很多东西在时序图中体现的已经非常清楚了,没有必要再一步一步的作介绍,所以本文以图为主,然后对部分内容加以简单解释。绘制图形使用的工具是PlantUML+VisualStudioCode+PlantUMLExtension本文对Tomcat的介绍以Tomcat-9.0.0.M22为标准。https:/
CPC广告优化:https://www.ikjzd.com/tl/97644
罗兰贝格聚焦-跨境电商发展机遇如何把握!:https://www.ikjzd.com/tl/97648
几位领导在办公室玩我 把她压在办公桌上进进出出:http://lady.shaoqun.com/m/a/247443.html
欧美夫妻作爱性姿势都是啥样的?试一下下边这五个体位 :http://lady.shaoqun.com/a/385299.html
女友爱打野战有什么姿势可以避免她走光?教你这几招 :http://lady.shaoqun.com/a/385300.html
FBA的优缺点分析&FBA收费明细:https://www.ikjzd.com/tl/97620
2021暑假福建哪里度假舒服 暑期福建旅游最美最舒适的地方:http://www.30bags.com/a/426746.html
华为每年都从这些学校大量招收员工,有你的学校吗:http://lady.shaoqun.com/a/151430.html
少妇口述:看色情片我把处女身献给未来老公:http://lady.shaoqun.com/a/273563.html
和老外交换真实经历 又大又粗弄的我欲仙欲死:http://lady.shaoqun.com/a/247889.html
校花被校长啪到腿软 啊校长你慢点啊好大啊:http://lady.shaoqun.com/m/a/247765.html
女性最喜欢的性姿势是什么,女性最爱的性技巧有哪些? :http://lady.shaoqun.com/a/385301.html

No comments:

Post a Comment