编程语言学习Tomcat(四)之Engine和Host容器

在前面的文章中,我们介绍了Tomcat的连接器Connector,连接器会监听指定的端口,并把接受到的消息转为HttpServletRequest和HttpServletResponse,交个Servlet容器处理。Tomcat的Servlet容器分为四种:Engin容器/Host容器/Context容器/Wrapper容器,这四个容器之间是父子关系,Engine容器包含Host容器,Host容器包含Context,Context包含Wrapper容器。本文会介绍Tomcat容器中的Engin容器和Host容器,在下一篇文章中会介绍Context容器和Wrapper容器。

Container的作用

Tomcat中的Container用于处理连接器处理好的Request和Response。Tomcat中的四种容器都继承自Container接口,其中Engin容器全局只有一个,是Container对外提供处理Request和Response的入口。Host容器是Engin容器的子容器,一个Engin容器可以包含多个Host容器,每个Host容器代表一个虚拟主机(下文会详细介绍)。Engin容器在收到请求之后,会按照虚拟主机的配置将请求映射到对应的Host容器之上。

Container的结构

如下图所示,Tomcat中的四种Container都有相同的结构,包含以下几部分关键组件:请求处理阀门链PipeLine、基础阀门BaseValve和日志组件等。

  1. PipeLine:用于流式加工处理请求中的信息,每个PipeLine中可以包含多个阀门Valve,每个Valve都有同样的方法invoke(Request request,Response response)

<valve classname="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
  1. BaseValve:基础阀门,和Piple中的阀门的接口相同方法:invoke(Request request,Response response),但是作用和Piple中的阀门不同,主要用于将请求传递到下一个容器或者对应的Servlet组件。

  2. 日志记录器和生命周期管理等组其它组件,不具体介绍。

Engine容器

如上图所示,每个Tomcat仅仅有一个Engin容器,Tomcat中的连接器接受并解析消息之后,会把消息的转给Engin容器,用户可以给Engin容器的PipeLine添加各种自定义的Valve,Engin容器会将一一调用PipeLine中的Valve。Engin容器的BaseValve是StandardEngineValve,这个Valve会读取Request中的Host信息,然后把请求路由给对应的Host容器。

final class StandardEngineValve extends ValveBase {

    public StandardEngineValve() {
        super(true);
    }

    @Override
    public final void invoke(Request request, Response response)
        throws IOException, ServletException {

        // Ignore some code here.
        // Select the Host to be used for this Request
        Host host = request.getHost();

        // Ignore some code here.

        // Ask this Host to process this request
        host.getPipeline().getFirst().invoke(request, response);
    }
}

Host容器

Host容器是Engine容器的子容器,每个Host容器都是一个虚拟主机,对应于不同的域名。http协议从1.1开始,支持在请求头里面添加Host字段用来表示请求的域名。DNS域名解析的时候,可以将不同的域名解析到同一个ip或者主机。Engine容器的BaseValve会读取Request中的Host,然后调用对应Host容器的PipeLine去处理消息。

什么是虚拟主机

假如我们需要在一个tomcat里面同时支持三个域名:

我们需要在server.xml文件里面的Engine标签下面添加多个Host标签,如下所示,其中name表示域名,appbase表示虚拟主机的目录。当我们在浏览器输入http://www.ramki.com之后,相应域名将请求到tomcat。tomcat通过读取并搜索server.xml,找到www.ramki.com对应的虚拟主机Host,然后就使用查找到的Host来处理请求。

在浏览器请求的时候,请求头信息如下,这儿我们重点关注Host header。

GET /appA/servletA/some-url HTTP/1.1
Host: www.ramki.com
Proxy-Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11
Accept: text/html,application/xhtml+xml,application/xml;q=0.9
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8

Context容器

Tomcat中一个Host容器可以包含多个Context容器,通常情况下一个Context容器标识一个应用,对应于wabapp目录下面的一个工程,在我的下一篇博客中会详细介绍Context容器。

本文最先发布至微信公众号!

www.bdsoba.com
www.sobd.cc
www.somanba.cn
(0)

相关推荐

  • servlet与tomcat

    servlet与tomcat

  • Tomcat 架构原理解析到架构设计借鉴

    Tomcat 架构原理解析到架构设计借鉴 Tomcat 发展这么多年,已经比较成熟稳定.在如今『追新求快』的时代,Tomcat 作为 Java Web 开发必备的工具似乎变成了『熟悉的陌生人』,难道说 ...

  • 针灸学习的四个层次

    <九针十二原>曰:"小针之要,易陈而难入,....粗守形,上守神,...粗守关,上守机",是说针灸治病,容易入手,但要达到精妙的地步却很困难.针灸看上去很简单,就是用针 ...

  • 学习有四种境界!(涨知识)

    文章作者|魏晋寒 图片来源|网络 学习是一件非常复杂的事情,但它却会让人生变得更加简单.正如作家刘同说的那样:"你必须非常努力,才能看起来毫不费力." 无论是学生时期的答题求解,或 ...

  • 学习强国“四人赛”容易错的题(四)

    101.世界上第一台现代电子计算机是( ENIAC ) . 102.在昆山腔的发展中,( 魏良辅) 等人对其进行了改良,改良后的昆山腔成为明代中叶至清代影响最大的声腔剧种. 103."天下泉 ...

  • 什么叫虚领顶劲?怎么理解?内家拳学习第四步

    真是有不少朋友和我讨论过这个问题.关于顶劲,前边我们已经做过头向上顶,同时也是肩向下垂的试验.顶劲,一定是头向上顶,这一点是容易统一的.可能是一提到"顶",则首先想到了牛羊,因为它 ...

  • 从搞笑的文理之争,看学习的四种结果

    经常有文科生和理科生的对掐,这几天还看到了专门的文章.有理科生自信地说:很多文科生缺乏逻辑能力,经常误民误国.文科生则回击说:理科生普遍缺乏人文常识.从我的所见来看,理科生这方面的攻击更多一些. 不得 ...

  • 学习强国四人赛解析之49——超难记的演奏家专题

    近日无新,学而时习.本期专题解析演奏家专题8道题目. 不仅答题,更是学习.让每个人都博古通今,能文能武:上知天文,下知地理,中晓人和:可九天揽月,可五洋捉鳖:前知五千年,后知八百载:运筹帷幄之中,决胜 ...

  • TensorFlow学习(四):梯度带(GradientTape),优化器(Optimizer)和损失函数(losses)

    更新时间: 2017.5.9 简化了很多不需要的内容,关注重点. 2019.4.17 更新到tensorflow 2.x,添加自动求导和新版本的optimizer 因为tensorflow 2.x相对 ...

  • 《中医基础理论》学习笔记(四)

    阴阳学说 阴阳学说是在气一元论的基础上建立起来的中国古代的朴素的对立统一理论,属于中国古代唯物论和辩证法范畴,体现出中华民族辩证思维的特殊精神. 阴阳学说认为:世界是物质性的整体,宇宙间一切事物不仅其 ...

  • 干货分享——提高学习强国四人赛快速答题精准度的制胜之策

    一.共性制胜之策.要坚决做到"两个必须". 1.所有答案为A选项,且没有姊妹题的单个题型,必须全部做到会盲答: 2.所有词语的正确词形和读音题,由于看题干无意义,必须全部做到条件反 ...