Tomcat源码解析(一):tomcat整体架构解析

由于本身对tomcat源码一直抱有兴趣,所以在阅读《深入剖析Tomcat》书籍时希望能整理记录,希望通过整理的方式使自己能更加全面的理解Tomcat各个模块的工作机制。

篇章主要解析Catalina模块源码,由于初次学习源码,所以较多内容会参照于书籍和网上博客。如果存在问题希望能指正帮助。

Tomcat总体架构中最主要组件为连接器(Connector)和容器(Container),连接器工作就是开启ServerSocket监听工作,阻塞等待远程Http请求到来,转换request、response转换,并将请求转交给容器处理;而容器Container就是管理Servlet工作Tomcat使用多层结构,层层嵌套的方式组织容器的工作,分别为Engine、Host、Context和Wrapper,其工作粒度依次细化。

举例如http://www.xxx.com/app/login方式的URL,

Engine容器:处于容器最顶层,表示整个Catalina的Servlet引擎  

Host容器:通常理解的虚拟主机,一个Host容器可管理多个上下文容器,比如www.xxx.com就是一个Host 

Context容器:常用的Web上下文容器,即一个Web应用,比如app,包含多个Wrapper

Wrapper容器:Wrapper代表实际Servlet容器,一个Wrapper封装一个Servlet,如login

Tomcat容器工作就是连接器等待Http请求,一旦请求到达,将请求转达给相关联的容器,而容器最简单可以只存在Context(一个Web应用),Tomcat性能主要取决于连接器(Connector)的并行处理能力,连接器和容器的工作机制如图所示。

从图中可以看出,连接器Connector调用容器Container的invoke开始转达,每一层容器都包含有Pipeline(管道),容器都会将请求委托给Pipeline处理。

public void invoke(Request request, Response response)
        throws IOException, ServletException {
        pipeline.invoke(request, response);
    }

Pipeline(管道)上绑定有多个Valve(阀),而Pipeline会按照顺序依次调用,类似过滤器链调用,Pipeline相当于过滤器链,阀类似过滤器,处理传递的request对象和response对象,前一个阀处理完毕调用下一个阀。每个Pipeline上最后一个阀(也可能唯一一个阀)是基础阀(StandardValve),基本阀会选择合适的子容器并转达请求,以做更细一步处理。比如Host容器组合的管道Pipeline上,基础阀StandardHostValve会选择合适的Context并调用其invoke方法。

  public void invoke(Request request, Response response,
                       ValveContext valveContext)
        throws IOException, ServletException {

        // 获取当前请求匹配的子容器Context
        StandardHost host = (StandardHost) getContainer();
        Context context = (Context) host.map(request, true);

        // 调用Context请求处理
        context.invoke(request, response);

    }

而Wrapper为最底层容器,对应基础阀StandardWrapperValue会创建当前请求的过滤器链FilterChina,并依次调用过滤器,过滤器都处理完毕后调用Servlet的service方法。如果按照上述流程,Tomcat启动初始,可以创建多个连接器(Connector)和一个容器(Container),然后将容器绑定在连接器上,如下所示:

public final class Bootstrap {
      public static void main(String[] args) {
          HttpConnector connector = new HttpConnector();
          SimpleContainer container = new SimpleContainer();
          // 绑定容器
          connector.setContainer(container);
          // 开启监听
          connector.initialize();
          connector.start();
        }
    }
}
如果使用这种方式,所有组件启动都需要用户自己管理并手动关联,同时需要用户分别启动和关闭每个组件。Tomcat使用专门的服务组件(Service)来管理连接器(Connector)和容器(Container),同时使用服务器组件(Server)作为Tomcat最顶层容器,管理所有Service服务的启动和关闭。也即Server代表整个服务器,包含至少一个Service用于提供服务,而每个Service主要包含对个Connector和一个Container,如图所示:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值