理解Tomcat架构、启动流程及其性能优化
PS:but, it's bullshit !?
備注:實話說,從文檔上扒拉的,文檔地址:在每一個Tomcat安裝目錄下,會有一個webapps文件夾,里面有一個docs文件夾,點擊index.html ?或者直接上官網看文檔也一樣:http://tomcat.apache.org/tomcat-8.0-doc/
一、Tomcat目錄結構說明
說明:這個是Tomcat 8 版本!
整體的目錄結構如下,對于每個文件夾都是干嘛的,文件夾內部的文件又是用來干嘛的,那就點開RUNNING.txt文件看吧,說的特別清晰明白。我就簡單說說第一層的內容:
?* bin ?- Only the following files:
? ? ? ? ? ?* setenv.sh (*nix) or setenv.bat (Windows),
? ? ? ? ? ?* tomcat-juli.jar
? ? ? ? ? The setenv scripts were described above. The tomcat-juli library
? ? ? ? ? is documented in the Logging chapter in the User Guide.
?* conf - Server configuration files (including server.xml)
?* lib ?- Libraries and classes, as explained below
?* logs - Log and output files
?* webapps - Automatically loaded web applications
?* work - Temporary working directories for web applications
?* temp - Directory used by the JVM for temporary files (java.io.tmpdir)
備注:webapps里面有培訓資料哦,Tomcat實現的Java EE規范,怎么實現的,都有哦!它告訴你怎么學Tomcat,傻瓜式教程,哈哈!
二、Tomcat的啟動流程
文檔路徑:http://tomcat.apache.org/tomcat-8.0-doc/architecture/index.html
1,Tomcat架構
server
在Tomcat的世界里,一個server代表了整個容器。Tomcat為用戶提供了server interface的默認實現,因此用戶可不必自定義實現。
service
service是server容器中的一個內部組件,它綁定一個或多個Connector到一個具體的引擎上。關于service節點很少有用戶去自定義實現,因為默認的實現足夠簡單和健全。
engine
engine表示特定服務的請求處理流程。一個service可能有多個connector,引擎接收并處理來自這些連接器的所有請求,將響應返回到適當的連接器以傳輸到客戶端。引擎接口可以自定義實現,盡管這并不常見。 請注意:引擎可以通過jvmRoute參數用于Tomcat服務器集群。 關于集群配置,需要閱讀集群文檔(媽蛋的,我是背不住那么多了,面試被問到,算我倒霉)
host
host是網絡名稱的關聯,例如www.yourcompany.com,關聯到Tomcat服務器。一個engine可能包含多個主機,Host元素還支持網絡別名,例如yourcompany.com和abc.yourcompany.com。用戶很少創建自定義host,因為StandardHost實現提供了顯著的附加功能
connector
一個connector處理與客戶端的通信。 Tomcat有多個connector,包括用于大多數HTTP流量的HTTP連接器,特別是作為獨立服務器運行Tomcat時,以及實現將Tomcat連接到Web服務器(如Apache HTTPD服務器)時使用的AJP協議的AJP連接器。創建定制連接器是一項巨大的工程。
context
一個context表示一個Web應用程序。一個主機可能包含多個上下文,每個具有唯一的路徑。可以實現Context接口來創建自定義上下文,但是很少出現這種情況,因為StandardContext提供了基本的所需功能
2,Tomcat的啟動流程
文檔路徑:http://tomcat.apache.org/tomcat-8.0-doc/architecture/startup.html
文檔里面有時序圖和文字說明,圖有點大,文字說明太過詳細,我直接簡化一下文字說明。
處理Tomcat命令(bootstrap類)——處理命令中的參數(bootstrap類)
處理Tomcat命令包括:
1,設置類加載器,第一個是公共類加載;第二個是共享的類加載;第三個是服務(應用)的類加載。備注:在5 的時候,Tomcat對lib里面的jar包做了分類,而現在沒有了!
2,通過反射加載用于啟動服務的類(Catalina),首先是加載公共的類,再加載服務的類
3,初始化Tomcat命令完成:Bootstrap.daemon.init()
處理命令中的參數包括:
這個過程很龐大,我說第一層宏觀,再詳細的,看文檔吧。以start 參數為例:
1,Catalina.setAwait(true)——2,Catalina.start()——3,?Tomcat receives a request on an HTTP port——4,Invocation of the servlet class
關鍵:根據Tomcat的啟動流程,可以優化的點:加快Tomcat的啟動:如果Tomcat的lib文件夾里面,有應用程序中涉及到的jar,那么刪除應用文件中的jar,maven使用provided標簽。 我在想一個問題,Tomcat會啟動一個JVM進程,那這個進程會首先去加載JRE里面的jar包,JDK,Tomcat容器,應用程序,這幾個之間能不能共享jar,如果不能共享,那要是我版本不一樣,jar沖突???
3,Tomcat處理一個請求的流程
時序圖,看了一下,大概是從協議—adapter適配—engine—host—context—filterChain—servlet
http://tomcat.apache.org/tomcat-8.0-doc/architecture/requestProcess/request-process.png
三、Tomcat優化
1,Tomcat官網的公共問題區有相關提問,可以參考一下
2,Tomcat給出的性能提升的方案建議:https://tomcat.apache.org/articles/performance.pdf? 哈哈,仔細看,那是相當有意思。
3,一個比較譜兒的網站,給出的關于Tomcat優化的幾個切入點:https://www.packtpub.com/mapt/book/application_development/9781849516624/3
4,一些別的說法:修改啟動模式、調整線程數等:http://tomcat.apache.org/tomcat-8.0-doc/config/http.html
轉載于:https://www.cnblogs.com/hhx626/p/8320424.html
總結
以上是生活随笔為你收集整理的理解Tomcat架构、启动流程及其性能优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Node.js 文件系统流pipe到Ht
- 下一篇: 开个地板砖店需要注意什么 创业者不止关注