之前的博⽂介绍了tomcat有两⼤核⼼组件,connector和container,connector负责接受外部请求,container负责处理请求,本⽂从源码的⾓度介绍container的整体架构。
⼀、容器分类
tomcat容器为四个:
Engine:代表容器引擎,管理多个虚拟站点,⼀个Service只有⼀个EngineHost:代表虚拟主机
Context:代表⼀个web站点Wrapper:代表⼀个servlet
⼆、容器的结构
以上四⼤容器是⽗⼦关系,但是统⼀实现了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);}
实现了统⼀接⼝,所以整体使⽤组合模式来进⾏组装和运转。
三、容器Pipeline、Valve(容器的执⾏链)
在Container的接⼝定义中有个Pippeline,这个就是当前容器的执⾏链,当执⾏到这个容器时,实际是执⾏这个pipeline进⾏实际的操作。
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返回最后⼀个节点。
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。BasicValve会调⽤⼦容器的getFirst节点把请求传给⼦容器。
上⼀篇博⽂中代码可以看到adapter是调⽤Engine的getFirst把请求传递到容器的。
整体过程
其中有⼀点需要说明的是BasicValve⽤于是pipeline的最后⼀个Valve。代码做了保证(setBasic⽅法)。
因篇幅问题不能全部显示,请点此查看更多更全内容