tomcat介紹
開源的 Java Web 應用服務器,實作了Java EE(Java Platform Enterprise Edition)的部分技術規范,比如 Java Servlet、JavaServer Pages、Java Expression Language、Java WebSocket,
(接觸最多的一款開源服務器,研究下原始碼結構,可加深對BS請求程序的理解)
目錄結構
bin目錄: 主要是用來存放tomcat的腳本,如startup.sh , shutdown.sh
conf 目錄: 下是組態檔
-
catalina.policy: Tomcat安全策略檔案,控制JVM相關權限,具體可以參考java. security.Permission
-
catalina.properties : Tomcat Catalina行為控制組態檔,比如Common ClassLoader
-
logging.properties : Tomcat日志組態檔, JDK Logging
-
server.xml : Tomcat Server組態檔
-
GlobalNamingResources :全域JNDI資源
-
context.xml : 全域Context組態檔
-
tomcat-users.xml : Tomcat角色組態檔
-
web.xml : Servlet標準的web.xml部署檔案, Tomcat默認實作部分配置入內:
-
org.apache.catalina.servlets.DefaultServlet
-
org.apache.jasper.servlet.JspServlet
-
lib目錄: 公共類別庫
logs目錄: tomcat在運行程序中產生的日志檔案
webapps: 用來存放應用程式,當tomcat啟動時會去加載webapps目錄下的應用程式
work: 用來存放tomcat在運行時的編譯后檔案,例如JSP編譯后的檔案
組態檔及腳本
# /bin/startup.sh 啟動 EXECUTABLE=catalina.sh exec "$PRGDIR"/"$EXECUTABLE" start "$@" # /bin/shutdown.sh 關閉 EXECUTABLE=catalina.sh exec "$PRGDIR"/"$EXECUTABLE" stop "$@" # 啟動和關閉都是呼叫 catalina.sh 腳本 # /bin/catalina.sh 發現如下2行 org.apache.catalina.startup.Bootstrap "$@" start org.apache.catalina.startup.Bootstrap "$@" stop
org.apache.catalina.startup.Bootstrap類是入口類,內部含有main方法,可以以此查看原始碼
#catalina.properties #限制可以訪問的包 package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.jasper.,org.apache.tomcat. #common類加載器可以加載的lib資源,catalina.base與catalina.home是相同 common.loader="${catalina.base}/lib","${catalina.base}/lib/*.jar","${catalina.home}/lib","${catalina.home}/lib/*.jar" server.loader=默認空,公用common.loader shared.loader=默認空,公用common.loader
<!-- server.xml --> <Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <Executor name="tomcatThreadPool"namePrefix="exec-my"prestartminSpareThreads="true" maxThread="200"maxThreads="500" minSpareThreads="8"maxIdleTime="10000"/> <Connector port="8080"protocol="HTTP/1.1"executor="tomcatThreadPool"connectionTimeout="20000"redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <!--<Context docBase="D:\myapp" path="/xxx" reloadable="true" />--> </Host> </Engine> </Service> </Server>
web應用部署
1、部署到webapps目錄下,該目錄下默認每個目錄都是一個應用,可以在server.xml檔案中用 <Host/>標簽自定義目錄位置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
2、在server.xml檔案中配置Context標簽
<Context docBase="D:\myapp" path="/xxx" reloadable="true" />
path: 指定訪問該Web應用的URL入口
docBase: 指定Web應用的檔案路徑,可以給定絕對路徑,也可以給定相對于<Host>的appBase屬性的相對路徑,
reloadable: 如果這個屬性設為true,tomcat服務器在運行狀態下會監視在WEB-INF/classes和WEB-INF/lib目錄下class檔案的改動,
如果監測到有class檔案被更新的,服務器會自動重新加載Web應用,
3、獨立的Context xml檔案配置
在$CATALINA_BASE/conf/[enginename]/[hostname]/ 目錄下(默認conf/Catalina/localhost)創建xml檔案,檔案名就是contextPath
比如創建api.xml,path就是/api, 注意:想要根目錄訪問,檔案名為ROOT.xml
官方架構圖

啟動程序
org.apache.catalina.startup.Bootstrap#main()-> bootstrap.init(); daemon.load(args); daemon.start(); org.apache.catalina.startup.Catalina#load()-> digester.parse(server.xml); getServer().init(); # start()->getServer().start(); org.apache.catalina.core.StandardServer#startInternal()-> for:services[i].start(); initInternal():for:services[i].init(); org.apache.catalina.core.StandardService#startInternal() -> engine.start(); for:executor.start(); for:connector.start(); org.apache.catalina.core.StandardEngine#startInternal()-> findChildren().for:executor.submit(new StartChild(children[i]));->FutureTask->StartChild.start() ((Lifecycle) pipeline).start(); threadStart()->new Thread(new ContainerBackgroundProcessor()).start();
核心組件
1、Server (org.apache.catalina.Server)
是指整個 Tomcat 服務器,包含多組服務,負責管理和啟動各個Service,同時監聽 8005 埠發過來的 shutdown 命令,用于關閉整個容器; org.apache.catalina.core.StandardServer

2、Service (org.apache.catalina.Service)
Tomcat封裝的、對外提供完整的基于組件的web服務,含有Connectors,Container2個核心組件,以及多個功能組件,各個service之間是獨立的,共享同一個JVM資源,每個service組件都包含了若干個用于接收客戶端訊息的connector組件和處理請求的Engine組件.
service組件還包含若干個Executor組件,每個都是一個執行緒池,他可以為service內所有組件提供執行緒池執行任務. org.apache.catalina.core.StandardService,

3、Connector
Tomcat 與外部世界的連接器,監聽固定埠接收外部請求,傳遞給 Container,并將Container 處理的結果回傳給外部.
org.apache.coyote.http11.Http11AprProtocol // AprEndpoint org.apache.coyote.http11.Http11NioProtocol // NioEndpoint org.apache.coyote.http11.Http11Nio2Protocol // Nio2Endpoint

4、Container
Catalina,Servlet容器,內部有多層容器組成,用于管理 Servlet 生命周期,呼叫 servlet 相關方法,
-
Engine : Servlet 的頂層容器,包含一個或多個 Host 子容器;
-
Host:虛擬主機,負責 web 應用的部署和 Context 的創建;
-
Context:Web 應用背景關系,包含多個 Wrapper,負責 web 配置的決議、管理所有的 Web 資源;
-
Wrapper:最底層的容器,是對 Servlet 的封裝,負責 Servlet 實體的創建、執行和銷毀,

// 子容器啟動程序
org.apache.catalina.core.ContainerBase#startStopExecutor.submit(new StartChild(children[i])) FutureTask->StartChild.start()
Context 應用加載
tomcat是如何加載web專案
-
WEB-INF/web.xml
-
零xml配置
// spi @HandlesTypes(WebApplicationInitializer.class)
org.apache.catalina.core.StandardContext#startInternal() org.springframework.web.SpringServletContainerInitializer#onStartup() ContextConfig#webConfig() org.apache.catalina.startup.ContextConfig#configureContext() //<load-on-startup>1</load-on-startup> org.apache.catalina.core.StandardContext#loadOnStartup() //servlet 初始化
Tomcat啟動機制(外置和內嵌)
1、Tomcat啟動帶動IoC容器啟動的邏輯

Spring boot中Tomcat容器和IoC容器的啟動順序
-
war外置: Tomcat啟動帶動IoC容器啟動
-
內嵌: Ioc容器帶動Tomcat啟動
org.springframework.boot.web.embedded.tomcat.TomcatWebServer#start
org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory#getWebServer
org.springframework.context.support.AbstractApplicationContext#refresh
其他組件
-
Loader:封裝了 Java ClassLoader,用于 Container 加載類檔案;
-
Session:負責管理和創建 session,以及 Session 的持久化(可自定義),支持 session 的集群,
-
Pipeline:在容器中充當管道的作用,管道中可以設定各種 valve(閥門),請求和回應在經由管道中各個閥門處理,提供了一種靈活可配置的處理請求和回應的機制,
-
JMX:Java SE 中定義技術規范,是一個為應用程式、設備、系統等植入管理功能的框架,通過 JMX 可以遠程監控 Tomcat 的運行狀態;
-
Realm:Tomcat 中為 web 應用程式提供訪問認證和角色管理的機制;
-
Jasper:Tomcat 的 Jsp 決議引擎,用于將 Jsp 轉換成 Java 檔案,并編譯成 class 檔案,
-
Naming:命名服務,JNDI, Java 命名和目錄介面,是一組在 Java 應用中訪問命名和目錄服務的 API,命名服務將名稱和物件聯系起來,使得我們可以用名稱訪問物件,目錄服務也是一種命名 服務,物件不但有名稱,還有屬性,Tomcat 中可以使用 JNDI 定義資料源、配置資訊,用于開發 與部署的分離,
官網連接
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/156152.html
標籤:Java
