15158846557 在线咨询 在线咨询
15158846557 在线咨询
所在位置: 首页 > 营销资讯 > 网站运营 > 学习Tomcat(四)之Engine和Host容器

学习Tomcat(四)之Engine和Host容器

时间:2023-07-15 05:42:01 | 来源:网站运营

时间:2023-07-15 05:42:01 来源:网站运营

学习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)


<Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!-- 默认 Valve --> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" <!-- maxDays="5" --> pattern="%h %l %u %t &quot;%r&quot; %s %b" /> <!-- 自定义 valve --> <Valve className="org.apache.catalina.valves.WswAccessValve"/> </Host> </Engine>

  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 name="www.ramki.com" appbase="ramki_webapps" /><Host name="www.krishnan.com" appbase="krishnan_webapps" /> <Host name="www.blog.ramki.com" appbase="blog_webapps" />

在浏览器请求的时候,请求头信息如下,这儿我们重点关注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.9Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8

Context容器



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



我是御狐神,欢迎大家关注我的微信公众号:wzm2zsd







本文最先发布至微信公众号,版权所有,禁止转载!

关键词:容器,学习

74
73
25
news

版权所有© 亿企邦 1997-2025 保留一切法律许可权利。

为了最佳展示效果,本站不支持IE9及以下版本的浏览器,建议您使用谷歌Chrome浏览器。 点击下载Chrome浏览器
关闭