自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解Tomcat內(nèi)部實(shí)現(xiàn)架構(gòu)解析

開發(fā) 架構(gòu) 服務(wù)器
Connector用于接收請(qǐng)求并將請(qǐng)求封裝成Request和Response,然后交給Container處理,處理之后在交給Connector返回給客戶端。

 

[[326737]]

Tomcat頂層架構(gòu)

 

詳解Tomcat內(nèi)部實(shí)現(xiàn)架構(gòu)解析

 

可以看到一個(gè)Server可以有多個(gè)Service,一個(gè)Service可以有多個(gè)Connector和一個(gè)Container,這兩部分是tomcat的核心。

1,Connector用于處理連接相關(guān)額事情,并提供Socket與Reponse相關(guān)的轉(zhuǎn)化

2,Container用于封裝和管理Servlet,以及具體處理Request請(qǐng)求

多個(gè)Connector可以提供多個(gè)鏈接,例如同時(shí)提供http和https鏈接,亦可以提供相同協(xié)議不同端口的鏈接,示意如圖:

 

詳解Tomcat內(nèi)部實(shí)現(xiàn)架構(gòu)解析

 

多個(gè)Connector和一個(gè)Container就形成了一個(gè)Service,但是還需要一個(gè)環(huán)境來管理整個(gè)多個(gè)Service(但是一般也就只有一個(gè)Service,就是常見得Catalina),這個(gè)就必須是Server了,具體可以看

server.xml文件配置:

 

詳解Tomcat內(nèi)部實(shí)現(xiàn)架構(gòu)解析

 

上面的配置用這張圖更加清楚的理解:

 

詳解Tomcat內(nèi)部實(shí)現(xiàn)架構(gòu)解析

 

下面來解析一下這個(gè)配置文件:

可以看到Server標(biāo)簽port設(shè)置為8005,shutdown="SHUTDOWN",表示8005端口監(jiān)聽到SHUTDOWN命令就關(guān)閉Tomcat服務(wù)。

Resource內(nèi)配置 pathname="conf/tomcat-users.xml" 指定manageUI登錄的用戶以及其他的全局配置。

這個(gè)Server里只有一個(gè)Service名為Catalina,Catalina支持兩個(gè)連接,分別是端口為8080的http連接和端口為8009的AJP連接,

Catalina這個(gè)服務(wù)里有一個(gè)站點(diǎn)名字叫l(wèi)ocalhoust,站點(diǎn)下的應(yīng)用群為appBase="webapps",支持自動(dòng)部署autoDeploy="true",

并設(shè)置了站點(diǎn)內(nèi)應(yīng)用打印的日志名稱及日志格式。

Connector和Container架構(gòu)分析

Connector用于接收請(qǐng)求并將請(qǐng)求封裝成Request和Response,然后交給Container處理,處理之后在交給Connector返回給客戶端。

可以分為四步:

  • 1,Connector如何接受請(qǐng)求的?
  • 2,如何將接受的請(qǐng)求封裝成Request和Response的?
  • 3,封裝完成后的Request和Reponse是如何交給Container的?
  • 4,Container處理完成后如何交給Connector并返回給客戶端的?

Connector結(jié)構(gòu)圖:

 

詳解Tomcat內(nèi)部實(shí)現(xiàn)架構(gòu)解析

 

Connector使用ProtocoHandler處理請(qǐng)求,不同的ProtocoHandler代表不同的類型,比如:Http11Protocol使用普通的Socke

t來連接,Http11NioProtocol使用NioSocket連接。

三個(gè)組件Endpoint用來處理底層Socket連接,Process用來將EndPoint接受到的Socket封裝成Request,Adapetr將Request

交給Container進(jìn)行具體的處理。

EndPoint底層處理Socket網(wǎng)絡(luò)連接,所以EndPoint是用來實(shí)現(xiàn)TCP/IP協(xié)議的,而Processor是用來實(shí)現(xiàn)HTTP協(xié)議的,

Adapetr將請(qǐng)求是配到Servlet容器進(jìn)行具體處理。AsyncTimeout用來監(jiān)聽請(qǐng)求是否超時(shí)。

現(xiàn)在1,2,3前三步已經(jīng)處理完了就剩最后一步Container如何處理請(qǐng)求了

Container結(jié)構(gòu)圖:

 

詳解Tomcat內(nèi)部實(shí)現(xiàn)架構(gòu)解析

 

四個(gè)子容器分別是:

1,Engine:引擎管理多個(gè)站點(diǎn)(Host),一個(gè)Service一個(gè)Engine

2,Host:代表一個(gè)站點(diǎn),在server.xml配置Host可添加站點(diǎn)

3,Context:代表一個(gè)應(yīng)該用程序,就是我們平時(shí)開發(fā)的程序,或一個(gè)WEB-INF目錄及web.xml文件

4,Wrapper:每個(gè)Wrapper封裝這一個(gè)Servlet

以上幾個(gè)容器和Tomcat目錄對(duì)應(yīng)如下:

 

詳解Tomcat內(nèi)部實(shí)現(xiàn)架構(gòu)解析

 

Context和Host的區(qū)別就是Context代表一個(gè)應(yīng)用,我們的Tomcat默認(rèn)webapps下的每一個(gè)文件夾都是一個(gè)Context,其中Root下放著主應(yīng)用,

其他的目錄都存放著子應(yīng)用。而整個(gè)webapps就是一個(gè)Host站點(diǎn)。

訪問應(yīng)用時(shí)如果放在了Root下可以直接Host的name屬性加Connector的端口就行,如果是自己建的就加上Context名稱就行了。

Container如何處理請(qǐng)求的?

使用了Pipeline-Valve管道來處理,其中用到了責(zé)任鏈模式,每一個(gè)處理者負(fù)責(zé)做自己的處理,處理完后將處理結(jié)果返回,

再交給下個(gè)處理者繼續(xù)處理,如圖:

 

詳解Tomcat內(nèi)部實(shí)現(xiàn)架構(gòu)解析

 

(1)Connector在接收到請(qǐng)求后會(huì)首先調(diào)用最頂層容器的Pipeline來處理,這里的最頂層容器的Pipeline就是EnginePipeline(Engine的管道);

(2)在Engine的管道中依次會(huì)執(zhí)行EngineValve1、EngineValve2等等,最后會(huì)執(zhí)行StandardEngineValve,在StandardEngineValve中會(huì)調(diào)用Host管道,然后再依次執(zhí)行Host的HostValve1、HostValve2等,最后在執(zhí)行StandardHostValve,然后再依次調(diào)用Context的管道和Wrapper的管道,最后執(zhí)行到StandardWrapperValve。

(3)當(dāng)執(zhí)行到StandardWrapperValve的時(shí)候,會(huì)在StandardWrapperValve中創(chuàng)建FilterChain,并調(diào)用其doFilter方法來處理請(qǐng)求,這個(gè)FilterChain包含著我們配置的與請(qǐng)求相匹配的Filter和Servlet,其doFilter方法會(huì)依次調(diào)用所有的Filter的doFilter方法和Servlet的service方法,這樣請(qǐng)求就得到了處理!

(4)當(dāng)所有的Pipeline-Valve都執(zhí)行完之后,并且處理完了具體的請(qǐng)求,這個(gè)時(shí)候就可以將返回的結(jié)果交給Connector了,Connector在通過Socket的方式將結(jié)果返回給客戶端。

 

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2020-05-12 23:20:50

Tomcat內(nèi)部結(jié)構(gòu)

2024-08-26 10:31:23

2023-12-13 08:31:23

2017-02-24 17:24:16

Etcd架構(gòu)分布式系統(tǒng)

2017-09-05 10:20:30

PyTorchTensorPython

2022-07-19 20:04:31

NAPI模塊鴻蒙

2019-12-06 11:18:07

LinuxCPU架構(gòu)

2009-07-15 14:08:06

MyEclipse T

2023-05-09 13:38:28

2017-12-13 15:33:02

LinuxNginxTomcat

2009-03-24 12:48:56

Nehalem服務(wù)器Intel

2015-06-29 09:51:45

支付寶

2010-07-19 14:13:41

Perl函數(shù)

2009-03-03 09:13:36

工作流BPM業(yè)務(wù)流程

2023-09-18 23:37:50

Kubernetes架構(gòu)

2018-11-09 10:09:38

RAC硬件軟件

2020-10-07 14:20:41

Tomcat深入解析

2018-10-08 09:05:52

TomcatServer配置

2010-09-17 15:57:23

TomcatJVM

2011-03-07 10:02:51

awstatstomcat
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)