tomcat处理请求过程

本文详细介绍了Tomcat处理HTTP请求的步骤,包括从浏览器发起请求到Tomcat接收并封装成request对象,再到程序员逻辑处理及响应。同时,文章还探讨了Tomcat创建session的流程,涉及session的查找、复用以及如何通过cookie在后续请求中保持session状态。

1.Tomcat对request的处理过程;

  • 浏览器发送请求到服务器后 tomcat中的acceptor线程会通过socket接收该请求
  • 服务器接收到请求后 acceptor会调用work方法,后者会调用Http11Protocol去解析http
  • 解析HTTP后得到的数据(请求头 请求体)会被服务器封装到request对象中 即产出request对象
  • 之后再又程序员编写的逻辑代码(service doget dopost方法等)进行处理 HTTP响应完后该request对象也会被销毁 request对象作用于整个请求链

2.Tomcat处理一个HTTP请求的过程;

  • 使用acceptor线程通过里面的socket去不断接收HTTP请求
  • 接收请求后将其请求头请求体解析封装
  • 处理完封装好的信息 返回相关结果给原请求 并结束本次HTTP请求

3.Tomcat创建 session 的流程;

  • 应用程序拿到的 HttpServletRequestorg.apache.catalina.connector.RequestFacade(除非某些 Filter 进行了特殊处理),它是 org.apache.catalina.connector.Request 的门面模式

  • 首先,会判断 Request 对象中是否存在 Session,如果存在并且未失效则直接返回,因为在 tomcat 中 Request 对象是被重复利用的,只会替换部分组件,所以会进行这步判断。

  • 此时,如果不存在 Session,则尝试根据 requestedSessionId 查找 Session,而该 requestedSessionId 会在 HTTP Connector 中进行赋值(如果存在的话)

  • 如果存在 Session 的话则直接返回,如果不存在的话,则创建新的 Session,并且把 sessionId 添加到 Cookie 中,后续的请求便会携带该 Cookie,这样便可以根据 Cookie 中的sessionId 找到原来创建的 Session

找到原来创建的 Session

[外链图片转存失败(img-BkrYnYbO-1569246757848)(C:\Users\洋\Desktop\contain.png)]

### 3.1 Tomcat线程池机制概述 Tomcat 使用线程池来管理 HTTP 请求处理线程,以提高并发性能。线程池的核心作用是复用线程,减少线程创建和销毁的开销,从而提升服务器的吞吐能力。当请求到达时,Tomcat 会从线程池中获取一个空闲线程来处理请求。如果所有线程都在忙碌,请求将被放入任务队列中等待处理。线程池的配置直接影响 Tomcat 的并发能力和资源利用率。 ### 3.2 Tomcat 线程池配置参数 Tomcat 线程池的配置主要通过 `server.xml` 文件中的 `<Executor>` 和 `<Connector>` 元素进行定义。以下是一些关键配置参数: - **maxThreads**:线程池中允许的最大线程数,决定了 Tomcat 能同时处理的最大请求数量。 - **minSpareThreads**:线程池中保持的最小空闲线程数,用于应对突发请求。 - **maxIdleTime**:线程在空闲状态下的最大存活时间,超过该时间后,线程将被终止并从线程池中移除。 - **acceptCount**:等待队列的最大长度,当所有线程都在忙碌时,新的请求将被放置在等待队列中。 以下是一个配置示例,展示了如何设置一个最大线程数为 1000 的线程池,并将其绑定到 HTTP 连接器上: ```xml <Executor name="tomcatThreadPool" namePrefix="zsl-catalina-exec-" maxThreads="1000" minSpareThreads="10" maxIdleTime="60000" /> <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" acceptCount="100" /> ``` 在上述配置中,`maxThreads="1000"` 表示线程池最多可以有 1000 个线程同时处理请求。`acceptCount="100"` 表示最多可以有 100 个请求在等待队列中排队等待处理[^4]。 ### 3.3 1000 个线程处理 10 个请求的机制 当 Tomcat 配置了 1000 个线程的线程池,但只有 10 个请求同时到达时,其处理机制如下: 1. **线程分配**:Tomcat 会从线程池中分配 10 个空闲线程来处理这 10 个请求。 2. **线程使用效率**:由于请求数量远小于线程池的最大容量,因此线程资源不会出现竞争,请求可以快速获得线程处理。 3. **空闲线程管理**:处理请求后,线程会返回线程池并进入空闲状态。如果 `maxIdleTime` 设置为 60 秒,则这些线程在空闲 60 秒后会被终止,以释放系统资源。 4. **任务队列使用**:若在处理过程中有新的请求到来,但当前所有线程都在处理任务,则新的请求将被放入任务队列中等待处理,直到有线程可用。 这种配置适用于高并发场景,确保在突发流量时仍能保持良好的响应能力。但需要注意的是,过多的线程会占用大量系统资源,可能导致线程上下文切换频繁,反而降低性能。 ### 3.4 线程池优化建议 为了在高并发场景下充分发挥线程池的性能优势,可以参考以下优化策略: - **合理设置 `maxThreads`**:根据服务器的 CPU 核心数和内存资源,合理设置线程池的最大线程数。通常建议将 `maxThreads` 设置为 CPU 核心数的 2 到 4 倍,以避免线程竞争导致的性能下降[^2]。 - **调整 `minSpareThreads`**:设置合理的最小空闲线程数,以减少线程频繁创建和销毁的开销。 - **控制 `maxIdleTime`**:避免线程长时间占用内存资源,尤其是在请求量波动较大的场景下。 - **优化 `acceptCount`**:根据系统负载和请求处理时间,合理设置任务队列长度,避免请求被丢弃或响应延迟过长。 通过上述配置和优化,可以有效提升 Tomcat 在高并发场景下的处理能力,确保系统稳定性和响应速度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值