tomcat如何处理请求 源码分析(一)( Connector 部分)

本文分析了Tomcat如何通过Connector接收并处理请求,重点讲解了从接收socket到HTTP协议解析的流程。内容包括:1) 接收socket;2) 将socket注册到Selector;3) 封装请求事件并放入队列;4) Poller消费事件,处理socket;5) 解析HTTP数据包为Request对象。通过NIO方式,Tomcat提高了系统的并发能力,减少了线程资源的浪费。
摘要由CSDN通过智能技术生成

上下文

tomcat源码分析共2个阶段
1.tomcat如何接收处理请求 源码分析(一)(Connector部分)本篇
2.tomcat如何接收处理请求 源码分析(二)
Container部分)

目标:

本文主要分析tomcat的Connector部分,一个请求如何封装为HttpRequest。主要包括NioEndpoint,Acceptor,Poller,PollerEvent,selector,SocketProcessor的一些细节。
下图的第一个框即是本文所研究的核心内容。第二个框和第三个框分别会在后面的文章描述。
本文研究范围
在这里插入图片描述

正文

我们使用tomcat的时候都知道它是多线程的,很多个用户同时访问的时候,他能够将每个应用分发给不同的线程,处理好之后将结果返回给浏览器。但是由于一个进程能打开的线程数量有限,如果使用BIO方式(一个请求对应一个线程)处理这些客户端发起的连接,妨碍了系统吞吐力的提升,所以现在的tomcat都采用了NIO的方式来提高系统的并发能力。

访问
访问
访问
访问
指定
指定
指定
指定
浏览器B1
服务器S
浏览器B2
浏览器B3
浏览器B4
线程1
线程2
线程3
线程4

BIO方式的B/S模型如上,服务器S作为一个请求接待者,凡是接收到一个socket连接请求,就会立即给这个sokect分配一个后台线程,这个后台线程会负责执行完整个请求的生命周期。那么这样有什么问题吗?为啥说这个方式影响并发呢?我的理解是,当浏览器发起连接的时候,可能并不会马上发送数据,而是等着用户输入。用户什么时候输入完成我的后端线程拿到数据才会进入逻辑执行阶段(比如查表等操作)。很明显这种情况没有充分的利用线程。要知道线程是十分宝贵的资源,不仅会占用一定的内存,同时也占用了cpu资源。

访问
访问
访问
访问
指定
指定
指定
指定
浏览器B1
Acceptor
浏览器B2
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值