论坛首页 Java企业应用论坛

Tomcat结构图

浏览 12937 次
锁定老帖子 主题:Tomcat结构图
精华帖 (1) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (3)
作者 正文
   发表时间:2011-01-13   最后修改:2011-01-14
    从前看过关于Tomcat的书,但是很快就忘记了。这次又看了一遍,随手画了个草图,来帮助记忆,没办法,我这个人,看图记忆有效些。



    Tomcat里有容器(Container)这么个概念,还有连接器(Connector)。我这幅图只画了容器这块儿的。
    总共有四种类型的容器:engine,host,context和wrapper。一个context里一般有一个或者多个wrapper,每个wrapper都对应了一个servlet。容器内所有组件的生命周期都由容器负责;容器内所有组件的行为都能受到容器的监控;容器可以对进出容器内部的数据进行改动。这是我能想到的采用容器的好处。
    如上图所示,图片中象梯子一样的那部分,我想用它代表容器的Pipeline。Host有自己的Pipeline,Context也有自己的Pipeline。一格一格的表示这个Pipeline里有很多Valve。Valve用来控制进入Host内部的数据。
    在最靠近Host内部的一个Valve,也就是数据进入Host要通过的最后一个Valve,叫做BasicValve。如果Host里有很多个Context,就是说有很多个Web程序,数据流在BasicValve里就会流向相应Context的Pipeline。

    鉴于上面的内容有些浅薄,那我再进一小步吧。

    我就按照上图来浅浅地描述一下request被处理的流程。
    对于每一个HTTP请求,connector调用其关联的container的invoke方法,该container调用其子容器的invoke方法。具体实现是在CoyoteAdapter的service方法里,由下面这一句就进入了Container的范围了。
connector.getContainer().getPipeline().getFirst().invoke(request, response);

getContainer()返回一个Host对象,然后得到Host对象的Pipeline,在调用Pipeline中第一个Valve对象的invoke方法。在Host对象的Pipeline中的最后一个Valve是StandardHostValve。

在StandardHostValve里,invoke函数中有:
context.getPipeline().getFirst().invoke(request, response);

这句函数就开始进入Context的范围了。同样的,在Context对象的Pipeline中的最后一个Valve是StandardContextValve。

在StandardContextValve里,invoke函数中有:
wrapper.getPipeline().getFirst().invoke(request, response);

这句函数就进入Wrapper的范围了。
Wrapper是这里面最小的容器,其内部就没有其它子容器了。当执行到Wrapper对象的Pipeline中最后一个Valve(StandardWrapperValve)时,会有下面的语句:
filterChain.doFilter(request.getRequest(), 
                                response.getResponse());


在FilterChain里,当最后一个filter被调用后,就会运行下面的语句。
servlet.service(request, response);

到这里,一个request就经历了重重考验,到了其目的地。
  • 大小: 19.1 KB
  • 大小: 29.6 KB
   发表时间:2011-01-13  
lz的图是否太简洁了。对于Host,context,Wrapper之间的关系好像描述的不是那么清楚。

0 请登录后投票
   发表时间:2011-01-13  
绘图能力太差了。
我一直都有个心愿,如果有机会去日本公司培训画图能力。
他们的绘图表达能力真好。
0 请登录后投票
   发表时间:2011-01-13  
tomcat源码现在还有c++吗?还是纯java的
0 请登录后投票
   发表时间:2011-01-13  
这个不如不发,误导读者。
其实随便哪个tomcat下面的server.xml看一下都会比这种图有一个更加直观的认识。
0 请登录后投票
   发表时间:2011-01-13  
nurenok 写道
tomcat源码现在还有c++吗?还是纯java的

都是拿java开发的阿,我看到的都是java
0 请登录后投票
   发表时间:2011-01-13  
michael.softtech 写道
这个不如不发,误导读者。
其实随便哪个tomcat下面的server.xml看一下都会比这种图有一个更加直观的认识。


高手。
0 请登录后投票
   发表时间:2011-01-13  
hyl1234 写道
lz的图是否太简洁了。对于Host,context,Wrapper之间的关系好像描述的不是那么清楚。


谢谢提醒
0 请登录后投票
   发表时间:2011-01-13  
Durian 写道
绘图能力太差了。
我一直都有个心愿,如果有机会去日本公司培训画图能力。
他们的绘图表达能力真好。

你是说动漫?
0 请登录后投票
   发表时间:2011-01-13  
海风308 写道
受教了,谢谢。

互相的,互相的
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics