设为首页 收藏本站
查看: 1042|回复: 0

[经验分享] Tomcat处理HTTP请求源码分析(下)

[复制链接]
发表于 2015-8-8 12:31:57 | 显示全部楼层 |阅读模式
  
  转载 http://www.infoq.com/cn/articles/zh-tomcat-http-request-2?utm_source=infoq&utm_medium=related_content_link&utm_campaign=relatedContent_articles_clk
  很多开源应用服务器都是集成tomcat作为web container的,而且对于tomcat的servlet container这部分代码很少改动。这样,这些应用服务器的性能基本上就取决于Tomcat处理HTTP请求的connector模块的性能。本文首先从应用层次分析了tomcat所有的connector种类及用法,接着从架构上分析了connector模块在整个tomcat中所处的位置,最后对connector做了详细的源代码分析。并且我们以Http11NioProtocol为例详细说明了tomcat是如何通过实现ProtocolHandler接口而构建connector的。

  上篇地址为《Tomcat处理HTTP请求源码分析(上)》 ,本文是系列下篇。
4 如何实现Connector
  由上面的介绍我们可以知道,实现Connector就是实现ProtocolHander接口的过程。
  AjpAprProtocol、AjpProtocol、Http11AprProtocol、Http11Protocol、JkCoyoteHandler、MemoryProtocolHandler这些实现类的实现流程与Http11NioProtocol相同,下面我们以Http11NioProtocol为类重点说明tomcat中如何实现ProtocolHander接口的。
  Http11NioProtocol实现了ProtocolHander接口,它将所有的操作委托给NioEndpoint类去做,如下图:
http://www.infoq.com/resource/articles/zh-tomcat-http-request-2/zh/resources/image1.jpg
  NioEndpoint类中的init方法中首先以普通阻塞方式启动了SocketServer:
http://www.infoq.com/resource/articles/zh-tomcat-http-request-2/zh/resources/image2.jpg
  NioEndpoint类的start方法是关键,如下:
http://www.infoq.com/resource/articles/zh-tomcat-http-request-2/zh/resources/image3.jpg
  可以看出,在start方法中启动了两个线程和一个线程池:

  • Acceptor线程,该线程以普通阻塞方式接收客户端请求(socket.accep()),将客户Socket交由线程池是处理,线程池要将该Socket配置成非阻塞模式(socket.configureBlocking(false)),并且向Selector注册READ事件。该线程数目可配置,默认为1个。
  • Poller线程,由于Acceptor委托线程为客户端Socket注册了READ事件,当READ准备好时,就会进入Poller线程的循环,Poller线程也是委托线程池去做,线程池将NioChannel加入到ConcurrentLinkedQueue队列中。该线程数目可配置,默认为1个。
  • 线程池,就是上面说的做Acceptor与Poller线程委托要做的事情。
4.1 Init接口实现方法中阻塞方式启动ServerSocketChannel
  在Init接口实现方法中阻塞方式启动ServerSocketChannel。
http://www.infoq.com/resource/articles/zh-tomcat-http-request-2/zh/resources/image4.jpg
4.2 Start接口实现方法中启动所有线程
  Start方法中启动了线程池,acceptor线程与Poller线程。其中acceptor与poller线程一般数目为1,当然,数目也可配置。
http://www.infoq.com/resource/articles/zh-tomcat-http-request-2/zh/resources/image5.jpg
  可以看出,线程池有两种实现方式:

  • 普通queue + wait + notify方式,默认使用的方式,据说实际测试这种比下种效率高
  • JDK1.5自带的线程池方式
4.3 Acceptor线程接收客户请求、注册READ事件
  在Acceptor线程中接收了客户请求,同时委托线程池注册READ事件。
  在setSocketOptions方法中,首先将socket配置成非阻塞模式:
http://www.infoq.com/resource/articles/zh-tomcat-http-request-2/zh/resources/image9.jpg
  在setSocketOptions方法中,最后调用getPoller0().register(channel);一句为SocketChannel注册READ事件,register方法代码如下(注意:这是Poller线程的方法):
http://www.infoq.com/resource/articles/zh-tomcat-http-request-2/zh/resources/image10.jpg
  其中attachment的结构如下,它可以看做是一个共享的数据结构:
http://www.infoq.com/resource/articles/zh-tomcat-http-request-2/zh/resources/image11.jpg
4.4 Poller线程读请求、生成响应数据、注册WRITE事件
4.5 Handle接口实现类通过Adpater调用Servlet容器生成响应数据
  NioEndpoint类中的Handler接口定义如下:
http://www.infoq.com/resource/articles/zh-tomcat-http-request-2/zh/resources/image16.jpg
  其中process方法通过Adapter来调用Servlet Container生成返回结果。Adapter接口定义如下:
http://www.infoq.com/resource/articles/zh-tomcat-http-request-2/zh/resources/image17.jpg
4.6 小结
  实现一个tomcat连接器Connector就是实现ProtocolHander接口的过程。Connector用来接收Socket Client端的请求,通过内置的线程池去调用Servlet Container生成响应结果,并将响应结果同步或异步的返回给Socket Client。在第三方应用集成tomcat作为Web容器时,一般不会动Servlet Container端的代码,那么connector的性能将是整个Web容器性能的关键。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-95773-1-1.html 上篇帖子: 【Java Web开发】Mac OS X安装Tomcat 7.0 下篇帖子: 配置tomcat
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表