TOMCAT簡單整理(二)

 

連接器:Coyote  

Coyote是Tomcat連接器框架的名稱,是Tomcat服務器提供的客戶端訪問的外部接口,客戶端通過Coyote與服務器建立連接,發送請求並接受響應。

Coyote封裝了底層的網絡通信(Socket請求及響應處理),爲Catalina容器提供了統一的接口,使Catalina容器與具體的請求協議及IO操作方式完全解耦。Coyote將Socket輸入轉換封裝爲Request對象,交由Catalina容器進行處理,處理請求完成後,Catalina通過Coyote提供的Response對象將結果寫入輸入流。 

Coyote作爲獨立的模塊,只負責具體協議和IO相關操作,和Servlet沒有直接關係,即便是Request和Response對象也沒有實現Servlet規範對應的接口,而是在Catalina中將它們進一步封裝爲ServletRequest和ServletResponse。

 在8.0之前,Tomcat 默認採用的I/0方式爲BIO,之後改爲NIO。 無論NIO、 NIO2 還是APR, 在性能方面均優於以往的BIO。如果採用APR, 甚至可以達到Apache HTTP Server的影響性能。


Tomcat爲了實現支持多種I/0模型和應用層協議,一個容器可能對接多個連接器,就好比一-個房間有多個門。但是單獨的連接器或者容器都不能對外提供服務,需要把它們組裝起來才能工作,組裝後這個整體叫作Service組件。這裏請你注意, service本身沒有做什麼重要的事情,只是在連接器和容器外面多包了一-層,把它們組裝在一-起。 Tomcat內可能有多個Service ,這樣的設計也是出於靈活性的考慮。通過在Tomcat中配置多個Service ,可以實現通過不同的端口號來訪問同一臺機器上部署的不同應用。

 

EndPoint:Coyote通信端點(通信監聽的接口),是具體的Socket接受和發送處理器,是對傳輸層的抽象,因此EndPoint用來實現TCP/IP協議。然後在Tomcat中,並沒有EndPoint接口,而是提供了一個叫做AbstractEndPoint抽象類,裏面定義了兩個內部類:Acceptor和SocketProcessor。Acceptor用於監聽Socket請求,SocketProcessor用於處理接受到的Socket請求,它實現了Runnable接口,在run方法內調用協議處理器組件Processor進行處理。爲了提高處理能力,SocketProcessor被提交到線程池來執行。

Processor:Coyote協議處理接口,如果說EndPoint是用來實現TCP/IP協議的,那麼Processor就是用來實現HTTP協議的,Processor處理來自EndPoint的Socket,讀取字節流解析成Tomcat Request、Response對象,並通過Adapter將其提交到容器處理,Processor是對應用層協議的抽象。

ProcessorHandler: Coyote協議接口,通過EndPoint和Processor,實現對具體協議的處理能力。

 

Adapter:由於協議不同,客戶端發過來的請求信息也不盡相同, Tomcat定義了自己的Request類來“存放”這些請求信息。ProtocolHandler接口負責解析請求並生成Tomcat Request類. 但是這個Request對象不是標準的ServletRequest ,也就意味着,不能用Tomcat Request作爲參數來調用容器。Tomcat設計者的解決方案是引入CoyoteAdapter ,這是適配器模式的經典運用,連接器調用coyoteAdapter的Sevice方法,傳入的是Tomcat Request對象, CoyoteAdapter負責將Tomcat Request轉成ServletRequest ,再調用容器的Service方法。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章