美文网首页
Tomcat——Tomcat处理请求流程

Tomcat——Tomcat处理请求流程

作者: 小波同学 | 来源:发表于2021-11-13 18:50 被阅读0次

    前言

    tomcat从架构上看,包含Service,Engine,Host,Context,Wrapper。那么,当用户发起一个请求时,tomcat是如何将url映射到具体的Wrapper上的呢?

    Mapper组件机制

    Tomcat 设计了 Mapper(映射)组件 完成 url和Host、Context、Wrapper等组件容器的映射。

    Mapper组件的核心功能是提供请求路径的路由映射,根据某个请求路径通过计算得到相应的Servlet(Wrapper)。

    与url到Wrapper映射相关的类位于org.apache.catalina.mapper包下,包含四个类:

    • Mapper:映射关系最核心的、最重要的类。完成url与Host,Context,Wrapper映射关系的初始化、变更、存储及映射
    • MapperListener:实现了ContainerListener与 LifecycleListener接口,监听tomcat组件的变化,当有Host,Context及Wrapper变更时,调用Mapper相关方法,增加或者删除Host,Context,Wrapper等。
    • MappingData:url映射后的数据,表示一个url具体映射到哪个host,哪个context,哪个wrapper上。
    • WrapperMappingInfo:表示一个Wrapper的信息,是一个普通的类,不太重要。

    Mapper主要功能是完成url到Wrapper的映射,有三个主要的功能

    • 1、映射关系存储:存储所有的Host,context及Wrapper的对应关系;
    • 2、映射关系初始化及变更:当新增一个组件或者移除一个组件时,mapper如何维护url到Wrapper的映射关系;
    • 3、映射关系使用:根据url,映射到具体的host,context和wrapper。

    总体结论

    一个Service有一个Engine,而一个Engine中有一个Mapper。根据Engine,Host,Context及Wrapper的对应关系,易得到以下的结论。

    • 一个Mapper中,应该保存有多个Host对象(的确是这样的,每个Host对象称之为MappedHost,多个MappedHost以数组形式组合,各元素通过其name进行排序)

    • 一个Host对象包含多个context(Context在Mapper中定义为MappedContext,也是通过数组形式存在,并且元素根据MappedContext的命名排序。但是与组件不同的是,每一个Context可以有多个版本,因此每一个MappedContext 包含了多个ContextVersion,每一个MappedContext下的多个ContextVersion表示同一个Context的多个版本)

    • 一个Context包含多个Wrapper(此处的Context在Mapper中为ContextVersion,包含多个Wrapper,这些Wrapper分成四类,精确匹配的Wrapper,前缀匹配的Wrapper,扩展名匹配的Wrapper,默认的Wrapper,在Mapper中,每一个Wrapper都通过一个MappedWrapper表示)

    因此,Mapper的构成可以用下图表示


    当一个请求到来时,Mapper组件通过解析请求URL里的域名和路径,再到自己保存的
    Map里去查找,就能定位到一个Servlet。请你注意,一个请求URL最后只会定位到一个
    Wrapper容器,也就是一个Servlet。

    从Tomcat的设计架构层面来分析Tomcat的请求处理。

    步骤如下:

    • 1、Connector组件Endpoint中的Acceptor监听客户端套接字连接并接收Socket。
    • 2、将连接交给线程池Executor处理,开始执行请求响应任务。
    • 3、Processor组件读取消息报文,解析请求行、请求体、请求头,封装成Request对象。
    • 4、Mapper组件根据请求行的URL值和请求头的Host值匹配由哪个Host容器、Context容器、Wrapper容器处理请求。
    • 5、CoyoteAdaptor组件负责将Connector组件和Engine容器关联起来,把生成的
      Request对象和响应对象Response传递到Engine容器中,调用 Pipeline。
    • 6、Engine容器的管道开始处理,管道中包含若干个Valve、每个Valve负责部分处理逻
      辑。执行完Valve后会执行基础的 Valve--StandardEngineValve,负责调用Host容器的
      Pipeline。
    • 7、Host容器的管道开始处理,流程类似,最后执行 Context容器的Pipeline。
    • 8、Context容器的管道开始处理,流程类似,最后执行 Wrapper容器的Pipeline。
    • 9、Wrapper容器的管道开始处理,流程类似,最后执行 Wrapper容器对应的Servlet对象的处理方法。

    请求流程源码解析

    在Tomcat的整体架构中,我们发现Tomcat中的各个组件各司其职,组件之间松耦合,确保了整体架构的可伸缩性和可拓展性,那么在组件内部,如何增强组件的灵活性和拓展性呢? 在Tomcat中,每个Container组件采用责任链模式来完成具体的请求处理。

    在Tomcat中定义了Pipeline 和 Valve 两个接口,Pipeline 用于构建责任链, 后者代表责
    任链上的每个处理器。Pipeline 中维护了一个基础的Valve,它始终位于Pipeline的末端
    (最后执行),封装了具体的请求处理和输出响应的过程。当然,我们也可以调用
    addValve()方法, 为Pipeline 添加其他的Valve, 后添加的Valve 位于基础的Valve之
    前,并按照添加顺序执行。Pipiline通过获得首个Valve来启动整合链条的执行 。

    未完待续。。。。。。

    参考:
    https://www.cnblogs.com/wansw/p/10244039.html

    https://blog.csdn.net/nblife0000/article/details/60364847

    https://blog.csdn.net/jiaomingliang/article/details/47414657

    https://blog.csdn.net/nmjhehe/article/details/115533383

    相关文章

      网友评论

          本文标题:Tomcat——Tomcat处理请求流程

          本文链接:https://www.haomeiwen.com/subject/oddzzltx.html