zoukankan      html  css  js  c++  java
  • Tomcat源码分析(3)-容器Container整体架构

    之前的博文介绍了tomcat有两大核心组件,connector和container,connector负责接受外部请求,container负责处理请求,本文从源码的角度介绍container的整体架构。

     一、容器分类

    tomcat容器为四个:

    • Engine:代表容器引擎,管理多个虚拟站点,一个Service只有一个Engine
    • Host:代表虚拟主机
    • 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方法)。

  • 相关阅读:
    单细胞分析实录(8): 展示marker基因的4种图形(一)
    单细胞分析实录(7): 差异表达分析/细胞类型注释
    单细胞分析实录(6): 去除批次效应/整合数据
    单细胞分析实录(5): Seurat标准流程
    R绘图(2): 离散/分类变量如何画热图/方块图
    R绘图(1): 在散点图边缘加上直方图/密度图/箱型图
    单细胞分析实录(4): doublet检测
    单细胞分析实录(3): Cell Hashing数据拆分
    单细胞分析实录(2): 使用Cell Ranger得到表达矩阵
    单细胞分析实录(1): 认识Cell Hashing
  • 原文地址:https://www.cnblogs.com/Brake/p/13204908.html
Copyright © 2011-2022 走看看