Tomcat NIO 处理机制
所属分类 tomcat
浏览量 1097
tomcat8.5
几种IO方式
BIO 同步阻塞 NIO 同步非阻塞 AIO 异步非阻塞
Java NIO IO多路复用 一个线程处理多个客户端连接
Tomcat NIO模式
客户端的请求先由一个接收线程接收
然后由若干个(一般为CPU的个数)线程轮询读写事件
最后将具体的读写操作交由线程池处理
不同IO方式的读写封装在Endpoint中 NioEndpoint
channel
向 selector 注册 连接 读写 事件
轮询 selector 中 的 selectKey集合
通过key找到对应的 channel ,通过绑定的buffer 进行读写
org.apache.tomcat.util.net.NioEndpoint
NIO tailored thread pool, providing the following services:
Socket acceptor thread
Socket poller thread
Worker threads pool
tailored 量身定制的
LimitLatch Acceptor Poller SocketProcessor Excutor
LimitLatch 维护连接计数,nio模式下默认10000,达到这个阈值后,拒绝连接请求
Acceptor 负责接收连接,默认由1个线程来执行,将连接请求注册到事件列表
Poller 轮询事件 ,Poller线程数 Math.min(2,Runtime.getRuntime().availableProcessors())
Poller将就绪的事件生成SocketProcessor,交给Excutor执行
SocketProcessor继承SocketProcessorBase,实现Runnable接口,可以提交给线程池Excutor 执行
doRun()方法,封装了读写Socket 完成Container调用逻辑
Excutor 是一个Tomcat线程池 ,用来执行Poller创建的SocketProcessor
Excutor线程池的大小 Connector节点 maxThreads
SocketProcessor 从socket中读取http request,解析成HttpServletRequest对象,分派到相应的servlet处理
然后将response通过socket发回client
从socket中读写数据时,并没有注册OP_READ或OP_WRITE事件到主Selector
而是直接通过socket完成读写,阻塞方式
在timeout控制上,使用NIO的Selector机制,该Selector并不是Poller线程维护的主Selector
而是BlockPoller线程中维护的Selector,称之为辅Selector
实现见org.apache.coyote.http11.Http11InputBuffer#fill
Reactor模型
Acceptor 负责accept事件
把接收到SocketChannel注册到Reactor池中的某个Reactor
SocketChannel的所有IO事件由该Reactor处理
见 org.apache.tomcat.util.net.NioEndpoint.setSocketOptions(SocketChannel)
每个Acceptor和Reactor都持有一个Selector
每个Acceptor和Reactor都是一个线程
tomcat中Reactor池 就是 Poller池
private Poller[] pollers = null;
public Poller getPoller0() {
int idx = Math.abs(pollerRotater.incrementAndGet()) % pollers.length;
return pollers[idx];
}
org.apache.tomcat.util.net.NioEndpoint.Acceptor
org.apache.tomcat.util.net.NioEndpoint.setSocketOptions(SocketChannel)
getPoller0().register(channel);
org.apache.tomcat.util.net.NioEndpoint.PollerEvent
Poller线程的作用
将Acceptor接收到的请求注册到Poller的事件队列中
Poller轮询事件队列,处理到达的事件,将PollerEvent中的通道注册到Poller的Selector中
轮询已就绪的通道,对每个就绪通道创建一个SocketProcessor,交个Tomcat线程池处理
SocketProcessor
SocketProcessor通过Http11ConnectionHandler,获取Htpp11Processor
Htpp11Processor调用prepareRequest方法,准备好请求数据
然后调用CoyoteAdapter的service方法进行request和response的适配
之后交给容器进行处理
org.apache.catalina.connector.CoyoteAdapter.service(Request, Response)
将请求交给StandardEngineValue处理
请求交给Tomcat容器后,将请求一层一层传递到Engin Host Context Wrapper
最终经过一系列Filter,来到 Servlet
tomcat8 连接器
java nio 编程模型简介
上一篇
下一篇
mysql redo undo binlog
tomcat8 嵌入式 servlet 实例
tomcat8 连接器
tomcat8的后台线程
tomcat请求处理过程
tomcat nio 读写关键代码