• 售前

  • 售后

热门帖子
入门百科

浅谈Tomcat多层容器的计划

[复制链接]
落败的青春阳落s 显示全部楼层 发表于 2021-8-14 15:08:26 |阅读模式 打印 上一主题 下一主题
目次


  • 容器的层次布局
  • 哀求定位Servlet的过程
  • 工作原理
Tomcat的容器用来装载Servlet。那Tomcat的Servlet容器是如何计划的呢?

容器的层次布局

Tomcat计划了4种容器:Engine、Host、Context和Wrapper


Tomcat通过这种分层,使得Servlet容器具有很好的机动性。
       
  • Context体现一个Web应用程序   
  • Wrapper体现一个Servlet,一个Web应用程序中可能会有多个Servlet   
  • Host代表一个假造主机,或一个站点,可以给Tomcat设置多个假造主机地址,而一个假造主机下可以摆设多个Web应用程序   
  • Engine体现引擎,用来管理多个假造站点,一个Service最多只能有一个Engine
观察Tomcat的server.xml设置文件。Tomcat接纳了组件化计划,最外层便是Server


这些容器具有父子关系,形成一个树形布局,Tomcat用组合模式来管理这些容器。
全部容器组件都实现Container接口,因此组合模式可以使得用户对
单容器对象
最底层的Wrapper
组合容器对象
上面的Context、Host或者Engine
的使用具有一致性。
Container接口界说:
  1. public interface Container extends Lifecycle {
  2.     public void setName(String name);
  3.     public Container getParent();
  4.     public void setParent(Container container);
  5.     public void addChild(Container child);
  6.     public void removeChild(Container child);
  7.     public Container findChild(String name);
  8. }
复制代码
哀求定位Servlet的过程

搞这么多层次的容器,Tomcat是怎么确定哀求是由哪个Wrapper容器里的Servlet来处理的呢?
Tomcat用Mapper组件完成这个使命。
Mapper就是将用户哀求的URL定位到一个Servlet

工作原理

Mapper组件生存了Web应用的设置信息:容器组件与访问路径的映射关系,好比
       
  • Host容器里设置的域名   
  • Context容器里的Web应用路径   
  • Wrapper容器里Servlet映射的路径
这些设置信息就是一个多层次的Map。
当一个哀求到来时,Mapper组件通太过析哀求URL里的域名和路径,再到本身生存的Map里去查找,就能定位到一个Servlet。
一个哀求URL末了只会定位到一个Wrapper容器,即一个Servlet。
假如有一网购体系,有
       
  • 面向B端管理职员的后台管理体系   
  • 面向C端用户的在线购物体系
这俩体系跑在同一Tomcat,为隔离它们的访问域名,设置两个假造域名:
manage.shopping.com
管理职员通过该域名访问Tomcat去管理用户和商品,而用户管理和商品管理是两个单独的Web应用
user.shopping.com
C端用户通过该域名去搜索商品和下订单,搜索功能和订单管理也是两个独立Web应用
如许摆设,Tomcat会创建一个Service组件和一个Engine容器组件,在Engine容器下创建两个Host子容器,在每个Host容器下创建两个Context子容器。由于一个Web应用通常有多个Servlet,Tomcat还会在每个Context容器里创建多个Wrapper子容器。每个容器都有对应访问路径


Tomcat如何将URL定位到一个Servlet呢?
首先,根据协媾和端标语选定Service和Engine
Tomcat的每个毗连器都监听差别的端口,好比Tomcat默认的HTTP毗连器监听8080端口、默认的AJP毗连器监听8009端口。该URL访问8080端口,因此会被HTTP毗连器吸收,而一个毗连器是属于一个Service组件的,如许Service组件就确定了。一个Service组件里除了有多个毗连器,还有一个Engine容器,因此Service确定了,Engine也确定了。
根据域名选定Host。
Mapper组件通过URL中的域名去查找相应的Host容器,好比user.shopping.com,因此Mapper找到Host2容器。
根据URL路径找到Context组件
Host确定以后,Mapper根据URL的路径来匹配相应的Web应用的路径,好比例子中访问的是/order,因此找到了Context4这个Context容器。
末了,根据URL路径找到Wrapper(Servlet)
Context确定后,Mapper再根据web.xml中设置的Servlet映射路径来找到具体Wrapper和Servlet。
并非只有Servlet才会去处理哀求,查找路径上的父子容器都会对哀求做一些处理:
       
  • 毗连器中的Adapter会调用容器的Service方法执行Servlet   
  • 最先拿到哀求的是Engine容器,Engine容器对哀求做一些处理后,会把哀求传给本身子容器Host继承处理,依次类推   
  • 末了这个哀求会传给Wrapper容器,Wrapper会调用终极的Servlet来处理
这个调用过程使用的Pipeline-Valve管道,责任链模式,在一个哀求处理的过程中有很多处理者依次对哀求进行处理,每个处理者负责做本身相应的处理,处理完之后将再调用下一个处理者继承处理。
Valve体现一个处理点,好比权限认证和记载日志。
  1. public interface Valve {
  2.   public Valve getNext();
  3.   public void setNext(Valve valve);
  4.   public void invoke(Request request, Response response)
  5. }
复制代码
由于Valve是一个处理点,因此invoke方法就是来处理哀求的。
Pipeline接口:
  1. public interface Pipeline extends Contained {
  2.   public void addValve(Valve valve);
  3.   public Valve getBasic();
  4.   public void setBasic(Valve valve);
  5.   public Valve getFirst();
  6. }
复制代码
以是Pipeline中维护了Valve链表,Valve可插入到Pipeline。
Pipeline中没有invoke方法,由于整个调用链的触发是Valve完成本身的处理后,调用getNext.invoke调用下一个Valve。
每个容器都有一个Pipeline对象,只要触发这个Pipeline的第一个Valve,这个容器里Pipeline中的Valve就都会被调用到。但差别容器的Pipeline如何链式触发?
好比Engine中Pipeline需要调用下层容器Host中的Pipeline。
Pipeline有个getBasic方法。这个BasicValve处于Valve链尾,负责调用下层容器的Pipeline里的第一个Valve。



整个调用过程由毗连器中的Adapter触发的,它会调用Engine的第一个Valve:

Wrapper

容器的末了一个Valve会创建一个Filter链,并调用doFilter方法,终极会调到Servlet的service方法。
Valve和Filter有什么区别呢?
       
  • Valve是Tomcat的私有机制,与Tomcat紧耦合。Servlet API是公有尺度,全部Web容器包罗Jetty都支持Filter   
  • Valve工作在Web容器级别,拦截全部应用的哀求。Servlet Filter工作在应用级别,只拦截某个Web应用的全部哀求。若想做整个Web容器的拦截器,必须使用Valve。
到此这篇关于浅谈Tomcat多层容器的计划的文章就先容到这了,更多相关Tomcat 多层容器内容请搜索草根技能分享从前的文章或继承欣赏下面的相关文章盼望各人以后多多支持草根技能分享!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作