谈起tomcat请求过程,我们就要从 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协议,如下图所示:
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.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
1)、统计Poller中有多少个新连接,这样当Poller进行 selector 时可以根据连接数量来决定是否需要阻塞来等待读写事件的到来