當然,這幅圖並沒有勾勒出整體的框架以及他們之間的關係,有另一幅圖表現了這個。
最初從bootstrap開始啟動,bootstrap會構造出最重要的3個classloader的層級結構,引導載入catalina這個核心類,並且接受外部的命令。
而catalina執行的最重要的任務就是在load方法中用digest將conf/server.xml這個配置檔案解析並且組裝好裡面的元件,這一組裝過程嚴格按照digest的rule來進行。而catalina會進一步分解bootstrap命令所呼叫的api。為什麼要有catalina呢,之前已經提過了,catalina最主要的作用就是裝配好了整個骨架,就像上帝造人,也得先造骨架,後面的肌肉**才能依存其上。
catalina將骨架搭好之後,就開始點火啟動server,server在整個伺服器中是乙個最大的概念,所有的元件都在其下,也就是說,如果我們想要操作伺服器,例如關閉,有種方式是將其他所有的元件乙個乙個關閉,但是有了server之後,只需要關閉server,他會負責關閉下面的所有元件,類似於乙個打包的概念。在server中,可以通過配置指定關閉的埠和命令。
connector是乙個抽象的元件,會根據配置來決定裝配哪些connector,connector對應的協議,埠等資訊。另外,connector物件還儲存了一些對引數限制的常數,比如最大引數數量(預設10000),最大的post大小(預設2m,事實上,post已經屬於協議的範疇了,按理應該放在http11protocol中,但是這裡由於呼叫者封裝性不能輕易的拿到http11protocol,故放到了connector)。所以,如果你需要自己設計乙個connector這樣的元件,應該也是有思路的。
engine,就是tomcat處理請求的引擎,類似於汽車發動機的核心地位,很多人覺得,為什麼tomcat不應該是乙個引擎就能讓系統運轉下去了嗎,讓他在service之下,豈不是可以有多個引擎了。的確,在正常的汽車中只有乙個引擎,但是不排除他有多個引擎的可能性,想想看,特殊跑車,飛機,甚至是合金裝備,都可能會有多個引擎。那麼,engine這個元素在這裡有什麼用呢,首先,他是host的上級元素,因為有他存在,所以可以方便的觸發並操作所有host;其次,engine中記錄了cluster時的jvmrouteid(想想看,為什麼這個jvmrouteid不定義在service?),這樣,集群環境下,tomcat才能夠互相標示。
host,大家都解釋為虛擬主機,那麼,在實際應用中虛擬主機到底有什麼用呢?由於connector是跟engine一起放在service中的,如果要復用connector,只能往engine下層走,即host。host的原始碼注釋中給出了另乙個應用的例子,即基於host的***可以攔截到該虛擬主機的所有request,而不是其他的host的,這裡我猜想一下***的實現可以用valve來做。關於host的更多解釋,可以參考第二第三篇文件。
pipeline,管道,之所有它的概念,是因為pipeline是用來更清晰的裝配valve的。可以這樣比喻,pipeline就像一條水管,request則是水管中流的水,而valve則是水管上的一排水龍頭。
valve,用於處理管道的過濾操作,而管道存在於engine, host, context中,所以valve可以過濾各個級別發來的請求。
realm,用於安全控制。主要是用來對使用者輸入的使用者名稱和密碼進行有效性判斷。
Tomcat生命週期的實現
當多個物件存在的時候,物件的建立,物件的銷毀,物件與物件之間關係的維護將是很大的問題,容器的引入,我們將物件的建立,物件關係的維護交給容器,即所謂的控制反轉。而對於物件生命週期的管理也是由容器進行負責,容器怎麼去實現物件生命週期的管理呢?容器中可能包含很多子容器以及很多元件,tomcat設計思想是入...
tomcat 的session 生命週期
1.session的建立 建立 request.getsession request.getsession true 第一次呼叫時建立session物件,並在response返回頭中新增 request.getsession,等同於request.getsession true 獲取其jsp或sev...
軟體的生命週期以及bug的生命週期
軟體生命週期 sdlc,systems development life cycle,sdlc 是軟體開始研製到最終被廢棄不用這樣乙個完整的過程叫做軟體生命週期,軟體生命週期又稱為軟體生存週期或系統開發生命週期,是軟體的產生直到報廢的生命週期,週期內有問題定義 可行性分析 總體描述 系統設計 編碼 ...