tomcat NIO工作流程

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

其NIO工作流程图如下:


在上图中最左边为浏览器(即发起请求),最右边为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<NioChannel,Http11NioProcessor>缓存中获取相应的Http11NioProcessor来继续处理,Http11NioProcessor主要是负责解析socket请求Header,解析完成后,会将Request、Response(这里的请求、响应在tomcat中看成是coyote的请求、响应,意思是还需要CoyoteAdaper处理交给CoyoteAdaper继续处理,CoyoteAdaper这里的工作主要将socket解析的Request、Response转化为HttpServletRequest、HttpServletResponse,而这里的请求响应就是最后交给Container去处理的。

Tomcat中NIO线程模型:


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

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




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值