tomcat伺服器源碼解讀,整體結構梳理,開源server,java servlet容器 ...
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>
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Context docBase="D:\myapp" path="/xxx" reloadable="true" />
docBase: 指定Web應用的文件路徑,可以給定絕對路徑,也可以給定相對於<Host>的appBase屬性的相對路徑。
reloadable: 如果這個屬性設為true,tomcat伺服器在運行狀態下會監視在WEB-INF/classes和WEB-INF/lib目錄下class文件的改動,
比如創建api.xml,path就是/api, 註意
:想要根目錄訪問,文件名為
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();
2、Service (org.apache.catalina.Service)
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 相關方法。
-
-
Host:虛擬主機,負責 web 應用的部署和 Context 的創建;
-
Context:Web 應用上下文,包含多個 Wrapper,負責 web 配置的解析、管理所有的 Web 資源;
-
Wrapper
// 子容器啟動過程
org.apache.catalina.core.ContainerBase#startStopExecutor.submit(new StartChild(children[i])) FutureTask->StartChild.start()
tomcat是如何載入web項目
-
WEB-INF/web.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 初始化
Spring boot中Tomcat容器和IoC容器的啟動順序
org.springframework.boot.web.embedded.tomcat.TomcatWebServer#start
org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory#getWebServer
org.springframework.context.support.AbstractApplicationContext#refresh
-
-
Session:負責管理和創建 session,以及 Session 的持久化(可自定義),支持 session 的集群。
-
Pipeline:在容器中充當管道的作用,管道中可以設置各種 valve(閥門),請求和響應在經由管道中各個閥門處理,提供了一種靈活可配置的處理請求和響應的機制。
-
JMX:Java SE 中定義技術規範,是一個為應用程式、設備、系統等植入管理功能的框架,通過 JMX 可以遠程監控 Tomcat 的運行狀態;
-
Realm:Tomcat 中為 web 應用程式提供訪問認證和角色管理的機制;
-
Jasper:Tomcat 的 Jsp 解析引擎,用於將 Jsp 轉換成 Java 文件,並編譯成 class 文件。
-
Naming