Tomcat原理系列之一:整体架构,抓住主线
Tomcat原理系列之一:整體架構,抓住主線
- Tomcat整體架構與重要組件
- 1.Tomcat整體架構
- 2.Tomcat重要組件
- 3.Tomcat生活場景類比
- 4.Tomcat層次結構的本質
- Tomcat的主線
- 1.main()方法入口
- 2.三條主線
- 3.時序圖
作為一個web容器,請求在服務端的第一站,理解tomcat對我們今后理解spring,理解springmvc等等很多框架都有很大的幫助。
Tomcat整體架構與重要組件
1.Tomcat整體架構
如果你瀏覽過Tomcat源碼相關文章,你一定對此圖不陌生.
2.Tomcat重要組件
- Server代表服務器,一個Tomcat只有一個Server
- Service 代表服務: 一個Server可以對外提供多個服務
- Connector連接器: service服務的核心組成之一,主要是鏈接客戶端請求
- Container容器:service服務的核心組成之一,主要是執行業務邏輯,這里按層級為Engine、Host、Context
3.Tomcat生活場景類比
我們可以舉個生活場景來理解tomcat
工商局(Tomcat)
- 工商局大樓(Server服務器)
- 辦證服務臺(Service),繳稅服務臺(Service) 等等。工商局提供多種服務能力
- 辦證服務臺有N個工作人員(Connector)接待客戶.
- 辦證服務臺后面那個屋子(Container)里面是幕后工作人員,處理各種流程中的任務
這樣理解起來是否清晰呢?
4.Tomcat層次結構的本質
Tomcat的這種層次結構在代碼層面是如何體現的呢?
答:上層持有下層對象的引用,即下層作為上層的一個屬性存在.
例如:Server組件里面持有 service的引用Service[] services = new Service[0]
為了維護這個關系:需要做什么?
需要在創建每層對象的時候也要把他的下層對象設置到自己屬性上。
如何維護這個關系
Tomcat將這種關系維護在server.xml配置文件中。
Tomcat內部使用了Digster工具將這種關系解析出來。
維護這個關系帶來哪些便利
因為有這種層級關系,所有tomcat在啟動,初始化的時候, 只需要啟動或者初始化最頂層的組件,就能將整個tomcat啟動起來。
Tomcat的主線
1.main()方法入口
即使像Tomcat這樣大的架構,也逃不出main()作為入口的規范.
正如上面所說:我們只需要執行頂層的啟動方法就能層級調用將整個tomcat啟動起來
Tomcat的啟動主要干了3件事,load(),init(),start()抓住這3條主線。我們就基本上了解了Tomcat整個架構的原理
main方法所在類是Bootstrap.class中,從名字我們也可以得知,這是一個啟動工具類,這個類也是三條主線的入口。Boostrap在內部會通過反射實例化處一個Catalina類
Catalina類是真正開始三條主線的位置。
public final class Bootstrap {public static void main(String[] args) {if (daemon == null) {Bootstrap bootstrap = new Bootstrap();try {bootstrap.init();//通過反射實例化出Catalina對象} catch (Throwable var3) {handleThrowable(var3);var3.printStackTrace();return;}daemon = bootstrap;} else {Thread.currentThread().setContextClassLoader(daemon.catalinaLoader);}try {String command = "start"daemon.setAwait(true);daemon.load(args);//依次調用Catalina的load(),getServer().init()daemon.start();//調用Catalina的start()方法}}2.三條主線
- Catalina.load():Catalina的load()方法,使用Digstet工具解析server.xml配置文件,通過解析創建每層組件對象; 并把下層對象設置到上層。(強力建議去搜索Digster理解下)
- Server().init(): 調用每層的init()方法,初始化每層組件的屬性等。包含Server,Service,Connector,Engine,Host,Context
- Catalina.start(): 調用每層的start()方法,啟動每層的容器,監聽等
3.時序圖
基于三條主線,畫出了相關時序圖。加深印象
建議配合時序圖,源碼,跟一下Tomcat源碼這樣。會對Tomcat整個原理有很深的理解。
(時序圖不是最完美的,但是我對流程的理解。人人都可以對照tomcat源碼畫出一個屬于自己的時序圖,如有不足請指出)
圖1:load()與init()時序圖
圖2start()時序圖
總結
以上是生活随笔為你收集整理的Tomcat原理系列之一:整体架构,抓住主线的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [hackinglab][CTF][解密
- 下一篇: 简单的实现RAII封装。