1. 程式人生 > >【Tomcat9原始碼分析】元件與框架概述

【Tomcat9原始碼分析】元件與框架概述

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