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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Tomat6架构探讨(二续)

發布時間:2025/3/21 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Tomat6架构探讨(二续) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Tomat6架構探討(續)

原文地址:http://carllgc.blog.ccidnet.com/blog-htm-do-showone-uid-4092-type-blog-itemid-283322.html?

Tomat源碼學習(二)?

下面,我們重點針對Catalina子模塊,熟悉Tomcat的幾個關鍵組件。?

(1)???服務器(Server) ??
Tomcat中,服務器代表整個J2EE容器,所有的服務及服務上下文均包含在服務器內。我們打開Tomcat源代碼,可以看到org.apache.catalina.Server這個接口,其中比較重要的方法有initialize(負責Tomcat啟動前的初始化工作),還有一些服務(Services)管理方法,比如removeService()addService()findService()之類的方法。?

Tomcat運行時,我們永遠只有一個Server實例,這不由讓我們聯想到單例模式(Singleton Pattern)。不錯,在Tomcat中,Server的實例化工作正是由一個叫ServerFactory工廠類完成的,這個工廠類實現了單例設計模式。?

比較有意思的是,這個工廠類的產品創建方法名為getServer()而不是標準的createServer()方法,并且沒有加synchronizedsynchronized(this)保護,這是為什么呢?我們知道,在應用單例模式時,需要注意的一個關鍵點就是多線程的調用問題,如果我們的工廠類在創建單例對象時,這個工廠類有可能被多個線程并發調用的話,那么最好給這個工廠方法加上synchronized以避免產生兩個不同的產品類實例。如果您想避免synchronized的鎖機制造成的性能損失,請使用雙重檢查機制(double-checked locking)。所以,如果考慮多線程,這個工廠類的getServer()方法應該寫成:(紅色代碼是作者另加上的,源代碼中沒有)。?

/**?

* Return the singleton <code>Server</code> instance for this JVM.?

*/?

public static Server getServer() {?

if( server==null ){?
synchronized (ServerFactory.class) {?
if(server==null){?
? server=new StandardServer();?
}?
}?

}?
return (server);?
}?

為什么Tomcat在實現時沒有加上面的紅色代碼呢?這是因為,Tomcat啟動時創建Server對象,不可能出現多線程情況,所以就免掉了雙重檢查。如果我們確信沒有多線程調用我們的單例工廠類,我們也可以這樣做。?

另外,如果您對ServerFactory進行調試,您會發現一個非常有趣的現象,這個工廠先執行的不是create方法(此處為getServer方法),而是setServer方法。這意味著這個工廠方法其實并不生產實際產品,實際產品是從別處產生,然后通過setServer方法注冊到這個Factory。當下次有客戶請求產品時,這個工廠方法只是簡單的把現成的單例產品傳給客戶。所以這個類其實只需一個單例類足矣,根本沒有必要使用工廠模式,所以Tomcat的開發者也覺得不好意思使用標準的工廠方法createProduct,殺雞焉用宰牛刀,對嗎??

Tomcat6.0中,服務器(Server)接口的實現類只有一個,那就是org.apache.catalina.core.?StandardServer類。這是一個標準的服務器實現類,這個類不但實現了Server接口,而且還實現了LifecycleMBeanRegistration接口,Lifecycle主要提供了服務器的生命周期管理功能,比如說啟動、停止等方法,而MBeanRegistration接口是為了將server注冊到MBean服務器,以便在Tomat運行時,我們能通過JMX來管理服務器。?

Tomcat5.0開始,Tomcat的開發人員在JMX管理上著實下了一番功夫,爭取做到讓Tomcat具有JBoss那樣非常強大的管理功能。?

(2)???服務(Service)?
在上述的標準服務器(StanderServer.java)實現代碼中,我們可以看到其中有一個services的數組,這個數組就是用來存儲服務(Service)的。所以,我們可以這樣理解,一個服務器可能有一至多個服務組成。所謂服務,就是包含一至多個連接器的組件,能夠對用戶請求作出響應的組件。打開org.apache.catalina.Service.java的源代碼,我們可以看到其中含有一個連接器數組(Connector[]),這表明一個Service有可能包含一個到多個連接器。但所有這些連接器都屬于一個引擎(EngineContainer)。在Tomcat6中,org.apache.catalina.Service接口由org.apache.catalina.core.?StandardService類來實現的。?

(3)???引擎(Engine)?
對一個具體的服務(service)來說,引擎是一個用戶請求的處理管道,這個管道很特別,因為它只處理Servlet請求,在Tomcat中,引擎其實就是指Servlet引擎。引擎從這些連接器那里接收到Servlet請求,然后處理它們,并將響應的結果傳回到適當的連接器,從而將響應發送到客戶端。簡單地說,引擎的功能就是如何處理用戶的Servlet請求。?

org.apache.catalina.Engine這個接口繼承自org.apache.catalina.Container,說明引擎是一種特殊的Container,是一種專門用來處理servlet請求的容器。?

(4)???主機(Host)?
Tomcat服務器來說,主機是Tomcats所在機器的網絡名(域名)。一個引擎可能包含多個主機,主機支持網絡別名。例如,用戶通過配置config.xml里面的主機(Host)元素,讓www.abc.comabc.com?指向同一臺Tomcat應用服務器。?

(5)???連接器(Connector)?
Tomcat中,連接器負責和客戶端進行請求響應的交流。Tomcat中有兩種連接器(CoyoteJK連接器)Coyote連接器實現了Http1.1協議,我們可以將它理解為TomcatWeb服務器部分。JK連接器負責處理來自第三方Web服務器的請求,并將請求結果發送給第三方Web服務器。針對Apache Httpd Web服務器,JK連接器實現了AJP協議。?

Tomcat6.0中,實現Coyote連接器的類是org.apache.catalina.connector.Connector?

(6)???上下文(Context)?
上下文代表某一具體的Web應用,一個主機可包含多個Web應用,所以可有多個Web應用上下文,不同的上下文可用不同路徑來表示。上下文里含有一些關于該Web應用的一些具體信息,比如歡迎頁面的文件名,web.xml文件的位置等等信息。?

上下文在Tomcat的源碼中對應org.apache.catalina.Context接口,其具體實現為org.apache.catalina.core.StandardContext?

至此為止,我們熟悉了Tomcat架構中一些重要組件。下面我們用UML類圖(Class Diagram)來總結一下。?



在上面的類圖中,我們先撇開Tomcat組件不談,首先給我們印象最深刻的一點是:針對接口編程,而非針對具體實現編程(Program to interface, not implementation)。人家老外這點確實值得我們學習。上面的類圖中,共有7個類,其余均為接口,這些類無一例外地調用了接口,而非具體的實現類。ServerFactory調用了Server接口,而非StandServer的實現類;Connector類調用了Service接口和Container接口,而沒有調用它們的實現類;StandardService類調用了Container接口和Server接口,也同樣沒有調用它們的實現類。所以我們在編程時,也要貫徹這條原則。?

<<Head First Design Patterns>>一書里,作者舉了個非常生動的例子,請看下面三段代碼:?

a)???代碼片段一?
Dog d=new Dog();?
d.bark();?

b)???代碼片段二?
Animal animal=new Dog();?
animal.makeSound();?

c)???代碼片段三?
Animal animal = getAnimal();?
animal.makeSound();?

作者詳細解釋了上面第三段代碼為什么是最好的,而第二段又為什么比第一段好的道理。東扯西拉這么多,現在我們切入正題。?

從上面的類圖中,我們可以非常清晰地理解Tomcat的總體架構:?

a)???Server(服務器)Tomcat構成的頂級構成元素,所有一切均包含在Server中,Server的實現類StandardServer可以包含一個到多個Services?

b)???次頂級元素Service的實現類為StandardService調用了容器(Container)接口,其實是調用了Servlet Engine(引擎),而且StandardService類中也指明了該Service歸屬的Server?

c)???接下來次級的構成元素就是容器(Container),主機(Host)、上下文(Context)和引擎(Engine)均繼承自Container接口,所以它們都是容器。但是,它們是有父子關系的,在主機(Host)、上下文(Context)和引擎(Engine)這三類容器中,引擎是頂級容器,直接包含是主機容器,而主機容器又包含上下文容器,所以引擎、主機和上下文從大小上來說又構成父子關系,雖然它們都繼承自Container接口。?

d)???連接器(Connector)沒有接口(這可是違反了面向接口編程的原則喲!),它直接實現了Http1.1協議。連接器將ServiceContainer連接起來,首先它需要注冊到一個Service,它的作用就是把來自客戶端的請求轉發到Container(容器),這就是它為什么稱作連接器的原因。?

下面我們來小結一下,Tomcat的架構從功能的角度,可以分成5個子模塊,它們分別是Connector子模塊,Jsper子模塊,Servlet子模塊,Catalina子模塊和Resource子模塊,每個子模塊負責一定的功能;從組件的角度,我們可以看到Tomcat中至少有7個關鍵組件,它們Server組件、Service組件、Container組件、Connector組件及繼承自Container組件的Host組件、Engine組件和Container組件,從UML Class Diagram中,我們可以非常明確地理解它們的包容關系。到此為止,希望我們能對Tomcat的架構有一個比較清晰的認識。?

轉載于:https://www.cnblogs.com/ToDoToTry/archive/2009/06/23/1509426.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Tomat6架构探讨(二续)的全部內容,希望文章能夠幫你解決所遇到的問題。

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