tomcat NIO工作流程

最近对tomcat的NIO实现进行研究,现总结一下:

其NIO工作流程图如下:

tomcat NIO工作流程_第1张图片

在上图中最左边为浏览器(即发起请求),最右边为Container(即容器,处理请求)。我们知道tomcat是基于组件设计的,从大的层次上,其组件可以分为Connector和Container,Connector的内部结构如上图(这里只是用NIO实现来讲Connector,Connector也可以采用BIO的方式),而Container有四种类型:StandardEngine、StandardHost、StandardContext、StandardWrapper,它们从左至右依次是包含关系,这个大家应该比较清楚。下面从模块之间的关联及多线程维度来说明NIO的工作流程:

从上图中,可以看出一个Connector包含一个Http11NioProtocol实例、一个CoyoteAdapter实例,Http11NioProtocol内部包含一个NioEndpoint实例、一个Http11ConnectionHandler实例,NioEndpoint主要是实现了socket请求监听线程Acceptor、socket NIO poller线程、以及请求处理线程池,对于Acceptor监听到的Socket请求,经过NioEndpoint内部的NIO 线程模型处理后,会转变为SocketProcessor在Executor中运行,其在Run过程中会交给Http11ConnectionHandler处理,Http11ConnectionHandler会从ConcurrentHashMap缓存中获取相应的Http11NioProcessor来继续处理,Http11NioProcessor主要是负责解析socket请求Header,解析完成后,会将Request、Response(这里的请求、响应在tomcat中看成是coyote的请求、响应,意思是还需要CoyoteAdaper处理交给CoyoteAdaper继续处理,CoyoteAdaper这里的工作主要将socket解析的Request、Response转化为HttpServletRequest、HttpServletResponse,而这里的请求响应就是最后交给Container去处理的。

Tomcat中NIO线程模型:

tomcat NIO工作流程_第2张图片

注:上图是针对一个socket poller线程的NIO模型,多个poller线程实际上也是一样的。

这里的线程模型主要是体现tomcat如何在多线程方面(Acceptor线程、poller线程、worker线程)及组件内部的模块方面实现NIO。我们可以看到Acceptor线程会将接受到的SocketChannel(即一个socket请求)封装为PollerEvent放到Poller线程中的ConcurrentLinkedQueue缓存中,注意到这里的缓存是ConcurrentLinkedQueue是支持并发的,那么在Poller线程的内部,它只需要从这个缓存中不停地获取PollerEvent然后处理就可以了。最后Poller线程处理完成后会封装成SocketProcessor交给NioEndpoint内的线程池Executor去处理。线程池中的Work thread线程在处理SocketProcessor过程中,会调用Http11ConnectionHandler处理,而Http11ConnectionHandler则ConcurrentHashMap缓存中获取相应的Http11NioProcessor来继续处理,这里要注意的ConcurrentHashMap也是支持并发的。后面的处理过程,前面已经说过。




你可能感兴趣的:(tomcat源码分析)