`

Tomcat处理HTTP请求源码分析(下)

 
阅读更多

多开源应用服务器都是集成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类去做,如下图:

NioEndpoint类中的init方法中首先以普通阻塞方式启动了SocketServer:

NioEndpoint类的start方法是关键,如下:

可以看出,在start方法中启动了两个线程和一个线程池:

  • Acceptor线程,该线程以普通阻塞方式接收客户端请求(socket.accep()),将客户Socket交由线程池是处理,线程池要将该Socket配置成非阻塞模式(socket.configureBlocking(false)),并且向Selector注册READ事件。该线程数目可配置,默认为1个。
  • Poller线程,由于Acceptor委托线程为客户端Socket注册了READ事件,当READ准备好时,就会进入Poller线程的循环,Poller线程也是委托线程池去做,线程池将NioChannel加入到ConcurrentLinkedQueue<NioChannel>队列中。该线程数目可配置,默认为1个。
  • 线程池,就是上面说的做Acceptor与Poller线程委托要做的事情。

4.1 Init接口实现方法中阻塞方式启动ServerSocketChannel

在Init接口实现方法中阻塞方式启动ServerSocketChannel。

4.2 Start接口实现方法中启动所有线程

Start方法中启动了线程池,acceptor线程与Poller线程。其中acceptor与poller线程一般数目为1,当然,数目也可配置。

可以看出,线程池有两种实现方式:

  • 普通queue + wait + notify方式,默认使用的方式,据说实际测试这种比下种效率高
  • JDK1.5自带的线程池方式

4.3 Acceptor线程接收客户请求、注册READ事件

在Acceptor线程中接收了客户请求,同时委托线程池注册READ事件。

    1. 在Acceptior线程中接收了客户请求(serverSock.accept())

    1. 委托线程池处理

    1. 在线程池的Worker线程的run方法中有这么几句:

在setSocketOptions方法中,首先将socket配置成非阻塞模式:

在setSocketOptions方法中,最后调用getPoller0().register(channel);一句为SocketChannel注册READ事件,register方法代码如下(注意:这是Poller线程的方法):

其中attachment的结构如下,它可以看做是一个共享的数据结构:

4.4 Poller线程读请求、生成响应数据、注册WRITE事件

    1. 在上面说的setSocketOptions方法中调用Poller线程的register方法注册读事件之后,当READ准备就绪之后,就开始读了。下面代码位于Poller线程的run方法之中:

    1. 可以看到,可读之后调用processSocket方法,该方法将读处理操作委拖给线程池处理(注意此时加入到线程池的是NioChannel,不是SocketChannel):

    1. 线程池的Worker线程中的run方法中的部分代码如下(请注意handler.process(socket)这一句):

注意:

  • 调用了hanler.process(socket)来生成响应数据)
  • 数据生成完之后,注册WRITE事件的,代码如下:

4.5 Handle接口实现类通过Adpater调用Servlet容器生成响应数据

NioEndpoint类中的Handler接口定义如下:

其中process方法通过Adapter来调用Servlet Container生成返回结果。Adapter接口定义如下:

4.6 小结

实现一个tomcat连接器Connector就是实现ProtocolHander接口的过程。Connector用来接收Socket Client端的请求,通过内置的线程池去调用Servlet Container生成响应结果,并将响应结果同步或异步的返回给Socket Client。在第三方应用集成tomcat作为Web容器时,一般不会动Servlet Container端的代码,那么connector的性能将是整个Web容器性能的关键。

分享到:
评论

相关推荐

    我的tomcat7源码手撕过程

    Tomcat初始化流程分析,Tomcat启动流程分析 Tomcat处理一次请求过程分析 servlet初始化流程

    tomcat 最全源码分析

    对 NIO 模式,请求的流程描述的很详细。值得去仔细的研究。

    https原理及tomcat配置https方法

    https原理及tomcat配置https方法;SSL加密传输;请求路径https://...;客户端需安装证书...

    Tomcat架构介绍与源码分析(含插件开发)

    通过剖析TOMCAT启动及请求流程来了解TOMCAT核心组件及动作原理 ?通过剖析核心组件的源码来深入理解TOMCAT内部原理?介绍实际项目中开发的TOMCAT插件,附源码?了解uml图绘制方法及工具介绍,并介绍常见开源框架的uml图

    apache-tomcat-8.5.50-src.zip

    分析Tomcat请求过程 链接器(Connector)与容器(Container) 解耦 Connector设计 监听服务端口,读取来自客户端的请求 将请求数据按照指定协议进行解析 根据请求地址匹配正确的容器进行处理 将响应返回客户端 ...

    SpringMVC源码分析.md

    Spring的源码分析 在分析SpringMVC源码之前我想先回顾一下JavaWeb的知识.JavaWeb的核心是Servlet,一个Servlet对应一个URL, 每次一个Http请求访问,那么对应URL的Servlet就会调用service方法处理。 其实这里我是对...

    nginx源码分析-高性能服务器编写

    Java有tomcat,jetty,websphere等众多服务器,pyhoen的zope等服务器。既有重量级的服务器,又有轻量级的,嵌入式的服务器。从互联网的应用来说,c语言的http服务器一直占有主导地位,当前最流行的三个开源服务器有...

    [线上问题] Nginx与Tomcat、Client之间请求的长连接配置不一致问题分析解决

    NULL 博文链接:https://bert82503.iteye.com/blog/2152613

    myTomcat:WebServer + Tomcat源码分析总结

    HTTP请求流程-&gt;初始日期一个HTTP请求: 前导工作: org.apache.catalina.startup.Bootstrap启动startup.sh/bat来启动其main(),main()调用Catalina的process() org.apache.catalina.startup.Catalina类的...

    分析Tomcat的工作原理

    SpringBoot 就像一条巨蟒,慢慢缠绕着我们,使我们麻痹。不得不承认,使用了 SpringBoot 确实提高了工作...但是,清楚 Tomcat 的工作原理和处理请求流程和分析 Spring 框架源码一样的重要。至少面试官特别喜欢问这些底

    大厂学院SVIP十门合集|完结无秘

    Web请求处理原理 数据访问层框架原理 架构与设计思维模式 程序中的数学 数据分析 机器智能算法剖析与应用 云原生 自动化DevOps 流量治理 链路监控 弹性扩容 分布式存储Redis6.0 深入云原生 高并发开发基石-JUC 全...

    网络应用程序大作业代码(MyBrowser,MyServer,MyManager)

    比较详细,不用修改,直接可用。 题目: 编写WEB客户端原型...分析比较myWebServer与其他WEB服务器(如Tomcat)的性能。 参考资料 1. 教材CH9 2. 《Tomcat安装使用手册》 3. 《Wireshark安装使用手册》

    基于Java实现的Web服务器与测试工具开发.zip

    基于Java编程语言,利用http socket通信技术,写一个小型的web服务器与一个爬虫的测试工具,来对比分析所写的服务器获取到的页面源码与从tomcat获取的相似度。 (1)小型web服务器: 1)支持客户端的网页请求,进行...

    【spring-boot-seckill分布式秒杀系统 v1.0】从0到1构建的java秒杀系统源码+安装说明

    4、异步、异步、异步,分析并识别出可以异步处理的逻辑,比如日志,缩短系统响应时间。 5、主备、主备、主备,如果有条件做好主备容灾方案也是非常有必要的(参考某年锤子的活动被攻击)。 6、最后,为了支撑更高的...

    一次因信号量引发的tomcat异常退出解决

    从日志上看,tomcat收到了退出请求,并按照要求关闭容器。那么是否可以认为是有人执行了shutdown.sh呢?并不能。执行了shutdown脚本的关闭日志是这样的。 与其相关的tomcat源码截图如下。截图左侧有行号。 tomcat...

    看透springMvc源代码分析与实践

    第四篇(第21章和第22章)总结整个SpringMVC架构知识并补充了异步请求相关的内容,涉及从更高层次分析SpringMVC的设计理念以及具体请求的处理过程,同时对异步请求进行了详细解析,帮助读者深入理解请求的实现方式。

    从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式

    如何正确使用NIO来构架网络服务器一直是最近思考的一个问题,于是乎分析了一下Jetty、Tomcat和Mina有关NIO的源码,发现大伙都基于类似的方式,我感觉这应该算是NIO构架网络服务器的经典模式,并基于这种模式写了个...

    JAVA上百实例源码以及开源项目源代码

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

    ssm学生成绩管理源码工程

    编写SpringMVC的Controller来处理前端的请求,并调用Service层的业务逻辑,Service层再调用DAO层的数据库操作。 前端设计:设计一个简单的前端界面,可以使用HTML、CSS和JavaScript,也可以通过模板引擎如Thymeleaf...

Global site tag (gtag.js) - Google Analytics