【Tomcat9原始碼分析】元件與框架概述
阿新 • • 發佈:2018-12-22
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