tomcat NIO工作流程
2015-12-10 17:32
267 查看
最近对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也是支持并发的。后面的处理过程,前面已经说过。
其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也是支持并发的。后面的处理过程,前面已经说过。
相关文章推荐
- java-模拟tomcat服务器
- i-jetty环境搭配与编译
- Python3写爬虫(四)多线程实现数据爬取
- 实现单Tomcat多Server配置
- 生产环境下的Tomcat配置
- spymemcached源码中Reactor模式分析
- Linux部署Tomcat服务器
- jenkins------结合maven将svn项目自动部署到tomcat下
- 如何搞定tomcat这只喵~
- Java IO与NIO的一些文件拷贝测试
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析