【Tomcat9源码分析】组件与框架概述

转载请注明出处:http://blog.csdn.net/linxdcn/article/details/73321304


1 组件与框架介绍



Server:代表整个Catalina Servlet容器,可以包含一个或多个Service

Service:包含Connector和Container的集合,Service用适当的Connector接收用户的请求,再发给相应的Container来处理

Connector:实现某一协议的连接器,用来处理客户端发送来的协议,如默认的实现协议有HTTP、HTTPS、AJP

Engine:接到来自不同Connector请求,处理后将结果返回给Connector。Engine是一个逻辑容器

Host:虚拟主机,即域名或网络名,一个Engine可以包含多个Host。

Context:部署的具体Web应用的上下文,每个请求都在是相应的上下文里处理,如一个war包

Wrapper:对应定义的Servlet

由上可知,Catalina中有两个主要的模块:连接器(Connector)和容器(Container)


2 组件功能

2.1 Server

Server为定义的接口,默认实现是StandardServer,主要作用有

  • 定义了 Servlet 容器的相关配置,即server.xml中的配置
  • 启动Server将启动所有的Tomcat组件,关闭Server将关闭所有组件

Server接口中重要的方法如下:

public interface Server extends Lifecycle {

    public int getPort();

    public void setPort(int port);

    public String getAddress();

    public void setAddress(String address);

    public String getShutdown();

    public void setShutdown(String shutdown);

    public void addService(Service service);

    public Service findService(String name);

    public Service[] findServices();

    public void removeService(Service service);
}

2.2 Service

Service为定义的接口,默认实现是StandardService,主要作用有

  • 逻辑上包含Connector和Container

Service接口中重要的方法如下:

public interface Service extends Lifecycle {

    public Engine getContainer();

    public void setContainer(Engine engine);

    public String getName();

    public void setName(String name);

    public Server getServer();

    public void setServer(Server server);

    public void addConnector(Connector connector);

    public Connector[] findConnectors();

    public void removeConnector(Connector connector);
}

2.3 Connector

Connector为定义的连接器类,默认实现的协议有http、https、AJP,主要作用有

  • 根据不同的协议解析客户端的请求
  • 将解析完的请求转发给Connector关联的Engine容器处理

Connector默认支持的协议如下:

/**
 * Defaults to using HTTP/1.1 NIO implementation.
 */
public Connector() {
    this("org.apache.coyote.http11.Http11NioProtocol");
}


public Connector(String protocol) {
    boolean aprConnector = AprLifecycleListener.isAprAvailable() &&
            AprLifecycleListener.getUseAprConnector();

    if ("HTTP/1.1".equals(protocol) || protocol == null) {
        if (aprConnector) {
            protocolHandlerClassName = "org.apache.coyote.http11.Http11AprProtocol";
        } else {
            protocolHandlerClassName = "org.apache.coyote.http11.Http11NioProtocol";
        }
    } else if ("AJP/1.3".equals(protocol)) {
        if (aprConnector) {
            protocolHandlerClassName = "org.apache.coyote.ajp.AjpAprProtocol";
        } else {
            protocolHandlerClassName = "org.apache.coyote.ajp.AjpNioProtocol";
        }
    } else {
        protocolHandlerClassName = protocol;
    }

    // Instantiate protocol handler
    ProtocolHandler p = null;
    try {
        Class<?> clazz = Class.forName(protocolHandlerClassName);
        p = (ProtocolHandler) clazz.getConstructor().newInstance();
    } catch (Exception e) {
        log.error(sm.getString(
                "coyoteConnector.protocolHandlerInstantiationFailed"), e);
    } finally {
        this.protocolHandler = p;
    }
}

2.4 Engine



Engine为定义的接口,默认实现是StandardEngine,主要有以下模块:

  • Cluster:实现tomcat管理
  • Realm:实现用户权限管理模块
  • Pipeline和Valve:处理Pipeline上的各个Valve,是一种责任链模式。只是简单的将Connector传过来的变量传给Host容器

2.5 Host



Host为定义的接口,默认实现是StandardHost,主要有以下模块:

  • Cluster:实现tomcat管理
  • Realm:实现用户权限管理模块
  • Pipeline和Valve:处理Pipeline上的各个Valve,是一种责任链模式

2.6 Context



Context为定义的接口,默认实现是StandardContext,主要有以下模块:

  • Realm:实现用户权限管理模块
  • Pipeline和Valve:处理Pipeline上的各个Valve,是一种责任链模式
  • Manager: 它主要是应用的session管理模块
  • Resources: 它是每个web app对应的部署结构的封装
  • Loader:它是对每个web app的自有的classloader的封装
  • Mapper:它封装了请求资源URI与每个相对应的处理wrapper容器的映射关系

2.7 Wrapper



Wrapper为定义的接口,默认实现是StandardWrapper,主要有以下模块:

  • Pipeline和Valve:处理Pipeline上的各个Valve,是一种责任链模式
  • Servlet和Servlet Stack:保存Wrapper包装的Servlet

转载请注明出处:http://blog.csdn.net/linxdcn/article/details/73321304

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值