tomcat处理请求的过程

本文详细阐述了从客户端请求到Tomcat处理直至返回响应的整个过程,包括请求的接收、虚拟主机的匹配、上下文的查找及Servlet的执行等关键步骤,特别强调了JSP首次访问的特殊处理方式。

我们知道了tomcat的启动过程,现在来看一下tomcat的处理请求的过程。


假设来自客户的请求为:http://localhost:8080/test/index.jsp

1、请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Connector获得
2、Connector把该请求交给它所在的Service的Engine来处理,并等待Engine的回应
3、Engine获得请求localhost:8080/test/index.jsp,匹配它所有虚拟主机Host
4、Engine匹配到名为localhost的Host(即使匹配不到也把请求交给该Host处理,因为该Host被定义为该Engine的默认主机)
5、localhost Host获得请求/test/index.jsp,匹配它所拥有的所有Context
6、Host匹配到路径为/test的Context(如果匹配不到就把该请求交给路径名为""的Context去处理)
7、path="/test"的Context获得请求/index.jsp,在它的mapping table中寻找对应的servlet

对于jsp,第一次访问会先翻译成servlet,所以第一次访问jsp会比较慢。

servlet默认在tomcat中只有一个实例。如果不配置load-on-startup,那么在第一次访问的时候初始化。

8、Context匹配到URL PATTERN为*.jsp的servlet,对应于JspServlet类
9、构造HttpServletRequest对象和HttpServletResponse对象,作为参数调用JspServlet的doGet或doPost方法
10、Context把执行完了之后的HttpServletResponse对象返回给Host
11、Host把HttpServletResponse对象返回给Engine
12、Engine把HttpServletResponse对象返回给Connector
13、Connector把HttpServletResponse对象返回给客户browser


原文:http://my.oschina.net/whp/blog/37586

### 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 在高并发场景下的处理能力,确保系统稳定性和响应速度。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值