热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Tomcat是如何处理一次请求的源码版本8.0.21

目录1.Tomcat容器构成2.Tomcat是如何接收一次请求的1.Tomcat容器构成2.Tomcat是如何接收一次请求的从上图可知Tomcat中有很多容器,包

目录

1.Tomcat容器构成

2.Tomcat是如何接收一次请求的



1.Tomcat容器构成

2.Tomcat是如何接收一次请求的

        从上图可知Tomcat中有很多容器,包括Server、Service、Connector等。其中Connector正是与HTTP请求处理相关的容器。Connector的实现分为以下几种:

  • Http Connector:基于HTTP协议,负责建立HTTP连接。它又分为BIO Http Connector与NIO Http Connector两种,后者提供非阻塞IO与长连接Comet支持。
  • AJP Connector:基于AJP协议,AJP是专门设计用于Tomcat与HTTP服务器通信定制的协议,能提供较高的通信速度和效率。如与Apache服务器集成时,采用这个协议。
  • APR HTTP Connector:用C实现,通过JNI调用的。主要提升对静态资源(如HTML、图片、CSS、JS等)的访问性能。

具体源码实现:setProtocol函数的入参protocol在server.xml中配置

 setProtocol函数代码作用:主要判断了是否启用Apr模式,如果启用,那么"HTTP/1.1"就将org.apache.coyote.http11.Http11AprProtocol这个类作为Handler,其他协议以此类推。

我们可以看到在关闭Apr模式的时候,配置"HTTP/1.1"是将Http11NioProtocol类作为Handler,Http11NioProtocol为NIO模式连接器,因为NIO模式涉及到生产者消费者模式,代码略复杂,下文我们将用Tomcat7中的Http11Protocol类(BIO模式)来剖析一次请求的过程。

可以看到Http11NioProtocol在构造的时候初始化了一个JIoEndpoint(通信端点)

在JIoEndpoint类中我们看到其内部类Acceptor启动一个线程,一直在循环接收请求

 

 跟进processSocket方法可以看到用线程池做了一次调用

跟进内部run方法下finally块中handler.process(socket, SocketStatus.DISCONNECT);开始调用handler处理请求

 继续跟进发现其调用super.process(socket, status);

最终我们一路跟进发现调用到AbstractHttp11Processor类中 process()方法 

在这个方法中我们可以看到,tomcat已经开始对request对象进行赋值。

最终将请求交给adapter去处理,

 最终调用connector.getService().getContainer().getPipeline().getFirst().invoke(request, response);将请求交给Engine的Pineline处理

 最终通过责任链模式,一步步的调用到ApplicationFiterChain执行Servlet的service方法。

 最终在HttpServlet类中去调用doGet方法,继而调用到我们继承自HttpServlet自定义的doGet方法。

 借鉴博文:阿里大佬总结的tomcat源码,写的非常好

Tomcat源码分析——生命周期管理 - 泰山不老生 - 博客园

Tomcat源码分析——请求原理分析(上) - 泰山不老生 - 博客园

Tomcat源码分析——请求原理分析(中) - 泰山不老生 - 博客园

Tomcat源码分析——请求原理分析(下) - 泰山不老生 - 博客园


推荐阅读
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 标题: ... [详细]
  • SpringMVC工作流程概述
    SpringMVC工作流程概述 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • UML 包图
    什么是包包可直接理解为命名空间,文件夹,是用来组织图形的封装,包图可以用来表述功能组命名空间的组织层次。•在面向对象软件开发的视角中&#x ... [详细]
  • iwanttowriteasimpleAppforme(Android).Forthisitisnecessarythattheservercansenddat ... [详细]
author-avatar
我家在波力牧场
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有