日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

一、前言

server.xml 配置,是 Tomcat啟動配置,從配置結構可以看出 Tomcat 的整體架構。如果能夠了解其常用配置項,對 Tomcat有一個高屋建瓴的把握,然后再庖丁解牛,一步步深入源碼中分析每一個核心功能的實現細節,這樣會有事半功倍的效果。

1.1 server.xml配置示例

窺探Tomcat整體架構,server.xml常用配置解析

 

  1. 如上圖 server.xml 配置,最外層是一個 Server,代表 Tomcat的運行實例。Server 里有一些監聽器 Listener,一個不知道干啥的 GlobalNamingResources,還有一個 Service,通過閱讀源碼,發現一個 Server 里可以有多個 Service。
  2. Service可以理解為是對部署在Tomcat里的服務的抽象,一個Tomcat可以部署多個服務,但是我更喜歡把一個Service理解成一個服務集合或者集群。
  3. Service里有一個 Executor、Connector 和 Engine。Executor是一個線程池,可以供 Contector使用;Connector 定義了協議連接(HTTP/AJP),外界就是通過Connector訪問Service里的服務的;Engine是容器引擎,可以理解它為Servlet容器,真正的業務處理在Engine里。通過閱讀源碼,一個Service可以有多個Executor,多個Connector,一個Engine。如果把Service比作一個房子,Connector比作門,一個房子可以有多個門就好理解了。
  4. Engine內部較復雜,它內部就像俄羅斯套娃,有多個子容器,子容器下又可以有多個子容器。正如Engine的英文含義,引擎,驅動和管理內部子容器。因為是最頂端的管理者,會包含一些組件輔助管理子容器。Engine可以有多個Host容器,可以理解為虛擬主機(URL地址中主機部分抽象);Host容器里有多個Context容器,Context就是一個個Web應用;Context容器里有多個WrApper容器,server.xml中一般不用配置,Wrapper是對Servlet的包裝,就是一個個業務功能了。
  5. 如果對應上Service房子的比喻,Engine可以比作房子里所有房間的總和,或者是通向每個房間的走道,Host就是一個個房間,房間里有一些家具家電(Context),每一個家具家電有很多功能(Wrapper)。
窺探Tomcat整體架構,server.xml常用配置解析

 

二、Tomcat運行實例Server

Server是Tomcat運行實例的抽象,管理著內部多個服務。在Tomcat源碼中Server的默認標準實現是
org.Apache.catalina.core.StandardServer:

  • 默認有6個生命周期監聽器,監聽Server不同運行階段的事件并作出響應。
  • GlobalNamingResources全局命名資源,通過JNDI提供統一的命名對象訪問接口。
  • Server監聽了一個端口,默認8005,如果這個端口傳來SHUTDOWN指令,則關閉Tomcat。
  • Server還有兩個定時任務,監聽觸發一些在Tomcat整個生命周期里周期性事件,暫時只有自動部署。

2.1 生命周期監聽器

(1)VersionLoggerListener


org.apache.catalina.startup.VersionLoggerListener監聽初始化階段,輸出一些運行日志,如操作系統、JDK、Tomcat版本信息以及catalina.base、catalina.home的定義等。

(2)AprLifecycleListener

Tomcat可以使用APR本地庫從操作系統級別解決異步IO問題,通過JNI方式調用APR本地庫大幅提高對靜態資源的處理性能。
org.apache.catalina.core.AprLifecycleListener對初始化前的事件和銷毀后的事件感興趣:

在Tomcat初始化前,AprLifecycleListener嘗試初始化APR庫,如果初始化成功,則使用APR接收并處理客戶端的請求。

在Tomcat銷毀后,AprLifecycleListener會對APR做一些銷毀終止操作。

(3)JreMemoryLeakPreventionListener


org.apache.catalina.core.JreMemoryLeakPreventionListener監聽器會在Tomcat初始化時使用系統類加載器預先加載一些JRE的類和設置URLConnection緩存禁用屬性,以避免線程上下文類加載器是Tomcat自定義的Webappclassloader時,加載JRE導致的內存泄漏和URLConnection緩存導致的鎖文件問題。

(4)GlobalResourcesLifecycleListener


org.apache.catalina.mbeans.GlobalResourcesLifecycleListener會在Tomcat啟動時為JNDI創建MBean,停止時銷毀MBean。

(5)ThreadLocalLeakPreventionListener


org.apache.catalina.core.ThreadLocalLeakPreventionListener監聽器監聽Context停止后,銷毀連接器Connector中Executor的所有核心工作線程,并重新創建,以避免使用ThreadLocal帶來的內存泄漏。

(6)NamingContextListener


org.apache.catalina.core.NamingContextListener監聽器在Tomcat啟動時創建并綁定全局命名資源,在Tomcat停止前做一些解綁全局命名資源、反注冊銷毀等操作。

2.2 GlobalNamingResources

GlobalNamingResources全局命名資源,通過JNDI提供統一的命名對象訪問接口。而JNDI(JAVA Naming and Directory Interface)是一個比較老舊的技術,在歷史遺留的企業級應用中可能還在用,諸如獲取一個數據庫連接資源、自定義配置等,這種強耦合在啟動配置文件里的方式已經不適用現在輕量級的應用和分布式服務了。(后續可以單獨研究下,這里了解即可。)

2.3 監聽SHUTDOWN命令

Tomcat啟動時,主線程做完所有啟動工作后,會進入循環等待SHUTDOWN的狀態。如果接收到SHUTDOWN,結束循環調用Tomcat停止銷毀接口。

實現方式很簡單,單獨給主線程建立一個socket連接,時刻監聽某個端口(默認8005),是否發來SHUTDOWN命令。

2.4 定時觸發自動部署周期性事件

Server啟動時,會開啟兩個定時任務,一個是每10秒觸發一次自動部署事件,而這個定時任務可能會因為自動部署的檢查和部署過程中出現異常導致該定時任務停止,所以就有了另一個定時任務每1分鐘檢查一次自動部署定時任務是否有在正常運行,沒有就重新設置。(自動部署是Host的工作,在Host的生命周期監聽器HostConfig中監聽執行)

三、服務抽象Service

Service默認標準實現是
org.apache.catalina.core.StandardService,如果在Server中配置了多個Service,name必須唯一,不可重復。

Service包含的組件有Executor、Connector、Engine,還有一個Mapper組件沒有在配置中體現,一般也不需要配置。

3.1 共享線程池Executor

Service中可以定義一些線程池,供Connector和其他組件使用。Tomcat沒有另起爐灶實現自己的線程池,而是在JUC的ThreadPoolExecutor基礎上做了定制化改造,默認標準實現是
org.apache.catalina.core.StandardThreadExecutor。

Executor可配置項如下:

窺探Tomcat整體架構,server.xml常用配置解析

 

注意:

如果指定Executor的實現是StandardThreadExecutor,那么prestartminSpareThreads無論是true還是false,都會預先創建minSpareThreads個核心工作線程。

3.2 連接器Connector

Connector是Service的門戶,一個Service可以有多個Connector。Connector定義了多種連接協議,配置較為復雜,現僅提供常見配置說明:

窺探Tomcat整體架構,server.xml常用配置解析

 

注意:

Tomcat10.0.6中NioEndpoint已經不能配置Poller線程和acceptor線程的個數,默認都是一個,同時AprEndpoint也標注為不建議使用,所以關于APR的配置也可以不用深入了解。后面會詳細研究Connector的內部實現,到時講解其他與源碼相關的配置項。

窺探Tomcat整體架構,server.xml常用配置解析

 

3.3 容器引擎Engine

Engine是Servlet容器最頂端的管理者,負責處理對應Service中所有請求,包含多個Host和其他組件。默認標準實現是
org.apache.catalina.core.StandardEngine。Engine以及其子容器都繼承自ContainerBase,都有些相似的組件,如AccessLog、Pipeline、Cluster、Realm、Log、LifecycleListener、ContainerListener等。

Engine、Host、Context都有一個同名前綴的LifecycleListener,如Engine的是EngineConfig,Host的是HostConfig,Context是ContextConfig,分別監聽自己感興趣的生命周期事件,如EngineConfig就是在Engine啟動停止時輸出一些日志。

對于Engine節點可選配置有如下幾個:

窺探Tomcat整體架構,server.xml常用配置解析

 

注意:

  • Engine即其子容器Host、Context、Wrapper都可以設置backgroundProcessorDelay這個參數,都可以有自己的后臺線程來延遲backgroundProcessorDelay時長周期性處理一些事情。如果backgroundProcessorDelay<=0則不會創建私有的后臺線程,默認Engine中這個參數是10,其他子容器是-1,所以一般情況子容器需要后臺處理的事情,都交由Engine啟動的后臺線程周期性延遲處理。
  • 上層容器啟動停止下層容器時,會用一個線程池來做異步處理。

3.4 URI映射器Mapper

Service中Mapper組件主要提供給Connector和Context使用,Connector中處理完連接后需要將請求信息交給對應的Host處理,可以通過Mapper的解析找到Host;Context通過Mapper找到對應的Servlet(Wrapper)處理業務。

Mapper還有一個對應的生命周期監聽器MapperListener,其主要監聽容器啟動后,將容器注冊到Mapper的關系中,建立一個樹狀結構。容器停止后做一些銷毀、反注冊操作。

(詳細的Mapper原理后面會單獨出文章講解)

四、虛擬主機Host

Host是Engine的子容器,默認標準實現是
org.apache.catalina.core.StandardHost。它的主要職責就是管理和部署子容器Context,比如,Host啟動前,預先創建好部署web應用的目錄;Host啟動時,部署web應用;Host運行過程中,周期性檢查web應用是否需要自動部署,這些監聽工作都是在HostConfig中做的。

如下是Host的一些常用配置:

窺探Tomcat整體架構,server.xml常用配置解析

 

4.1 Host部署web應用

Host部署web應用(Context)的三種方式:

  • Context描述文件部署,默認是%CATALINA_BASE%/conf/[EngineName]/[HostName]/目錄下,可以有多個Context配置,后綴必須為.xml??梢酝ㄟ^xmlBase指定Context配置文件存放目錄。
  • WAR包部署,即將web應用打包成一個.war部署,默認放在%CATALINA_BASE%/webapps目錄下,可以通過appBase指定一個絕對路徑。
  • 目錄部署,默認也是放在%CATALINA_HOME%/webapps目錄下。

三種部署的過程都是解析實例化Context,而后兩者web應用可能有自己的META-INF/context.xml,則通過解析它來組裝生成Context,否則就解析全局的
%CATALINA_BASE%/conf/context.xml。

五、Web應用Context

Context是對Web應用的抽象,相對其他容器有很多組件,且結構上復雜很多。默認標準實現是
org.apache.catalina.core.StandardContext,其主要的職責有:

  • Wrapper管理,Context下有很多Wrapper,Wrapper是對Servlet的包裝抽象,是最小的容器。
  • 錯誤頁面ErrorPage管理,在web.xml里可以配置請求處理過程中發生異常重定向的頁面路由。
  • 會話Session管理。
  • Jar包掃描和加載,一個Context有一個自定義類加載,掃描和加載/WEB-INF/lib下的jar包。
  • 熱加載,定期檢查/WEB-INF/lib和/WEB-INF/classes目錄下的.jar和.class文件是否更新,更新了就重新加載。熱加載過程較消耗資源,僅適用于開發環境,不可用于生產環境。
  • ServletContainerInitializer的初始化。
  • 除了生命周期監聽器外,還有很多其他監聽器。
  • 實例管理。
  • 靜態資源緩存管理。

Context常用配置如下

窺探Tomcat整體架構,server.xml常用配置解析

 

5.1 Resources配置

Resources是對靜態資源的抽象,可以設置緩存以提高響應性能。默認標準實現是
org.apache.catalina.webresources.StandardRoot。

窺探Tomcat整體架構,server.xml常用配置解析

 

StandardRoot中有五種WebResourceSet:preResources、mainResources、classResources、jarResources、postResources,支持的配置如下:

窺探Tomcat整體架構,server.xml常用配置解析

 

六、Servlet包裝器Wrapper

Wrapper相對于Engine、Host、Context是最小的容器,其父容器必須是Context,沒有其他子容器。默認標準實現是
org.apache.catalina.core.StandardWrapper。一般情況一個Servlet對應一個Wrapper,這就是為什么Servlet不是線程安全的了,Servlet以單例的實現存在,多個線程訪問肯定不是線程安全的,雖然有Servlet對象池的選擇,但是Tomcat10.0.6已經不建議這樣做。

七、要點總結

本篇只對server.xml常用的配置進行解釋,并通過配置文件節點關系,大概梳理了Tomcat整體架構。

Tomcat是一個非常優秀的開源項目,值得揉碎了仔細研究的細節實在太多,比如:

  • 線程池定制化改造;
  • 連接Connector的設計以及如何連接到容器Engine的;
  • Mapper組件如何解析映射URI;
  • 一個請求的處理和響應過程;
  • 生命周期框架的設計;
  • 自定義類加載器加載機制,如何做到隔離和共享,如何打破雙親委派;
  • 熱部署,熱加載的實現細節;
  • 如何解析server.xml配置;
  • 部署web應用的細節;
  • 容器之間如何做到有序連接,Pipeline和Valve的實現細節;
  • Servlet如何實現雙向過濾;
  • 各種監聽器
  • 等等

作者:徐同學呀

原文鏈接:
https://blog.csdn.net/weixin_36586120/article/details/118281370

分享到:
標簽:Tomcat
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定