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

来源:互联网 发布:施工企业oa软件 编辑:程序博客网 时间:2024/04/25 07:26

由于本身对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 0
原创粉丝点击