华人澳洲中文论坛

热图推荐

    一次申请的前因后果 - Tomcat架构解析(二)

    [复制链接]

    2022-11-24 09:19:19 26 0

    容器,简略了解就是用来装货色的工具。在Tomcat外面,容器被设计用来装载Servlet, 也就是咱们往常写的普通的Servlet ,就会寄放在容器外面。这也就是我们往常念道的Servlet容器,其实从狭义上了解,Servlet容器是指Tomcat,从广义上了解,Servlet容器,只是Tomcat外面的一个组件罢了。1. 容器概述Tomcat采取分层构造设计了4种容器,这4种容器分别是: Engine 、Host 、Context 、Wrap 。它们钧承继 Container 容器接口。这样设计使得Tomcat在处置申请时,分工更为明白,也使得容用具有很好的灵敏性。



    其中从左到右: Engine 表现引擎,用来办理多个虚构站点,一个Service至多只能有一个Engine。 Host代表虚构主机,或者表现站点。其实就是咱们配置出来的虚构映照地址。Context表现一个Web运用,Wrap 名为包装,它其实就是外部包装着咱们写的Servlet。
    为了便利大家了解,咱们能够从Tomcat外面的server.xml中看出来一些端倪。



    这四个容器呈现的是一个父子包孕瓜葛:



    2. 定位Servlet
    在Tomcat外面使用Mapper 映照器来完成Servlet的定位任务。在最后启动名目的时分,Tomcat就开始解析了名目的配相信息,而后使用Mapper来保留了详细的映照地址和Host、Context、Wrap的对应瓜葛。当申请到来的时分,就会到Mapper外面去查找婚配的Wrap(Servlet),而后调用。当咱们为了便利了解,咱们能够浅显的以为Mapper其实就是一个相似Map键值对的容器。2.1 全局概览好比: 上面的图示,咱们能够把瑞吉点餐名目的面向办理员后盾名目和面向用户前端名目部署在同一个Tomcat上,为了隔离它们,咱们经过配置虚构域名,也就是两个Host。而用户零碎,定单零碎,产品零碎,购物车零碎又都是能够独立运转的运用,所以咱们能够配备4个Context来对应它们。最初一排的Wrap,其实就是各自零碎中的Servlet了。



    2.2 申请到来
    此时用户使用 http://user.reggie.com:8080/cart/delete 来拜候。2.2.1 定位Service和Engine因为来访的时分,使用的是8080端口,正好被Http衔接器捕获到。在Tomcat外面,Service外面包孕着: 衔接器和容器。找到了衔接器,也就象征着找到了容器,这也就象征着Engine就肯定了。
    2.2.2 定位Host
    Service和Engine肯定了之后,就在Mapper中,经过门路地址,找到响应的Host容器。因为使用的是user.reggie.com 拜候,所以这就肯定了是Host2这个容器。
    2.2.3 定位Context
    Host肯定了之后,持续在Mapper中查找。因为使用的/cart拜候,所以这就定位到了Context4这个运用。
    2.2.4 定位Wrap
    Context肯定了之后,后续也就可以按照地址 /delete,轻而易举的找到 Wrap6 这个容器。最初也就定位到了Servlet。
    2.3 申请传递
    Tomcat 外面是如何把申请从最外层的容器Engine,始终往里传递到Wrap,而后履行Servlet的调用的呢? 谜底是使用 Pipeline-Valve 管道。 Pipeline-Valve 是责任链模式,责任链模式是指在一个申请处置的过程当中有得多处置者挨次对申请进行处置,每个处置者担任做本人相应的处置,处置完之后将再调用下一个处置者持续处置。上面经过一个张简略的草图来形容:
    每一个个容器都有一个Pipeline对象,两头的每一个个圆圈,其实表现的是一个Valve,它表现处置点。在Pipeline外面保护这Valve的链表。只有履行了第一个Pipeline的Valve,这个容器中的Pipeline就会被调用,直到最初末真个Basic的Valve,它担任去衔接下一个子容器的第一个Valve处置点。这样不停的串连起来,终究就抵达了Servlet。



    值得留意的是: 在Wrap的最初一个Basic的Valve的处置点外面,它会创立一个Filter过滤器链,而后在doFilter办法中终究调用Servlet的service办法。
    3. 总结
    本文次要给大家形容了Tomcat了外面的容器构造,以及申请到来的时分,是如何辨认究竟履行了哪一个Servlet。申请的链式调用是基于 Pipeline-Valve 责任链来实现的,这样的设计使得零碎拥有良好的可扩展性,假如需求扩展容器自身的功用,只需求减少相应的 Valve 便可。

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    返回列表 本版积分规则

    :
    中级会员
    :
    论坛短信
    :
    未填写
    :
    未填写
    :
    未填写

    主题32

    帖子50

    积分220

    图文推荐