日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Tomcat原理系列之一:整体架构,抓住主线

發布時間:2023/12/10 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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]

public final class StandardServer extends LifecycleMBeanBase implements Server {private static final Log log = LogFactory.getLog(StandardServer.class);private Context globalNamingContext = null;private NamingResourcesImpl globalNamingResources = null;private final NamingContextListener namingContextListener;private int port = 8005;private String address = "localhost";private Random random = null;private Service[] services = new Service[0]; //Server 持有Service的數組....}

為了維護這個關系:需要做什么?
需要在創建每層對象的時候也要把他的下層對象設置到自己屬性上。
如何維護這個關系
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原理系列之一:整体架构,抓住主线的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。