Tomcat源碼分析(3)-容器Container總體架構

以前的博文介紹了tomcat有兩大核心組件,connector和container,connector負責接受外部請求,container負責處理請求,本文從源碼的角度介紹container的總體架構。web

 1、容器分類

tomcat容器爲四個:tomcat

  • Engine:表明容器引擎,管理多個虛擬站點,一個Service只有一個Engine
  • Host:表明虛擬主機
  • Context:表明一個web站點
  • Wrapper:表明一個servlet

2、容器的結構

以上四大容器是父子關係,可是統一實現了Container接口:架構

public interface Container extends Lifecycle {
public Pipeline getPipeline(); public Container getParent(); public void setParent(Container container); public void backgroundProcess(); public void addChild(Container child); public Container findChild(String name); public Container[] findChildren(); public void removeChild(Container child); }

實現了統一接口,因此總體使用組合模式來進行組裝和運轉。app

 

3、容器Pipeline、Valve(容器的執行鏈)

在Container的接口定義中有個Pippeline,這個就是當前容器的執行鏈,當執行到這個容器時,實際是執行這個pipeline進行實際的操做。spa

Pipeline接口定義

public interface Pipeline {
    
    public Valve getBasic(); public void setBasic(Valve valve);

    public void addValve(Valve valve);

    public Valve[] getValves();

    public void removeValve(Valve valve);

    public Valve getFirst(); public boolean isAsyncSupported();

    public Container getContainer();

    public void setContainer(Container container);
}

Pipeline猶如一個鏈表,valve是其中的每個節點(也是具體的執行單元),其中getFirst返回第一個節點,getBasic返回最後一個節點。code

Valve定義

public interface Valve {
    public Valve getNext();

    public void setNext(Valve valve);

    public void backgroundProcess();

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

每個Valve執行完畢後會調用getNext把請求傳給下一個Valve。blog

BasicValve會調用子容器的getFirst節點把請求傳給子容器。接口

上一篇博文中代碼能夠看到adapter是調用Engine的getFirst把請求傳遞到容器的。ip

 

總體過程

 

 

 其中有一點須要說明的是BasicValve用因而pipeline的最後一個Valve。代碼作了保證(setBasic方法)。rem

相關文章
相關標籤/搜索