tomcat9请求过程

谈起tomcat请求过程,我们就要从 Connector 组件说起

一、结构和职责

1、Connector 结构:

Connector 具体细化为 Connector(连接器)、Protocol(协议)、Processor(处理器)

2、职责:负责处理浏览器发送过来的tcp连接请求,创建request 和 response 对象用于和请求端交换数据,connector 会把 request 和 response 传给处理请求的 container 组件,该组件会创建一个线程来处理这个请求。

3、通过源码我们发现,tomcat9 已经废弃了BIO,只有NIO 模式了,支持的协议有 http 和 AJP ,http 对应的处理类是 org.apache.coyote.http11.Http11NioProtocol 和 org.apache.coyote.http11.Http11AprProtocol,AJP 对应的处理类是 org.apache.coyote.ajp.AjpAprProtocol 和 org.apache.coyote.ajp.AjpNioProtocol,默认是协议是http协议,如下图所示:

二、start 方法简介

1、由于请求分不同的协议,这里我们讲一下常见的http协议,也就是 NIoEndPoint 处理,NIO核心的模块有 Channel、Selector 和 Buffer, 下面简单梳理一下流程,总流程图:

下面看一下源码:

2、由以上过程我们可以得出,最终的逻辑都是在NioEndpoint中实现的,下面分析分析 NioEndpoint

2.1、结构,它主要有内部类 Poller、PollelEvent、NioSocketWrapper、SocketProcessor、SendfileData 组成,源码如下:

2.2 处理流程,NioEndpoint 中 有以下四个步骤

2.2.1、创建SocketProcessorBase处理器、PollerEvent 事件、NioChannel 缓存

2.2.2、创建 corePoolSize 10、maximumPoolSize 200、keepAliveTime 60s、LinkedBlockingQueue、 名称前缀是 TP-exec- 的 线程池

2.2.3、初始化最大连接数为 10000 的连接限制

2.2.4、开启数量是 2 和 CPU 核数中的较小值的 Poller 轮询器,线程开启后一直轮询处理 PollerEvent 事件,PollerEvent 事件执行就是将 NioSocketWrapper(NioChannel 和 NioEndpoint封装对象) 注册到 selector ,NioSocketWrapper 和 SelectionKey 绑定,事件执行完之后放入缓存,这样做为了避免频繁创建事件和销毁事件而消耗资源。

2.2.5、开启默认数量是1 的 Acceptor 接收器,开启后线程一直运行着,Socket接收连接,将NioChannel 和 NioEndpoint 封装成 NioSocketWrapper ,添加PollerEvent 事件到队列中

3、下面重点分析一下 Poller、PollerEvent 和 Acceptor

Poller

wakeupCounter

1)、统计Poller中有多少个新连接,这样当Poller进行 selector 时可以根据连接数量来决定是否需要阻塞来等待读写事件的到来

2)、标识Poller进行 selector 时是否有连接到达,如果有就会立刻返回,否则就会阻塞等待1s

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值