一文徹底搞懂 Tomcat !
微信搜索逆鋒起筆關(guān)注后回復(fù)編程pdf
領(lǐng)取編程大佬們所推薦的 23 種編程資料!
Tomcat是做Java Web開發(fā)時部署服務(wù)最受歡迎的容器,關(guān)于它的運(yùn)行機(jī)制和調(diào)優(yōu)參數(shù)本文進(jìn)行一定的整理。
Architecture

配置
<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.core.AprLifecycleListener" />
<Listener className="org.apache.catalina.core.JasperListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<Engine name="Catalina" defaultHost="www.testwebapp.com">
<Host name="www.testwebapp.com" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>
Server組件,頂級元素,是Tomcat的運(yùn)行實例,一個JVM只包含一個Server組件 Listener,內(nèi)置的一些監(jiān)聽器,可以幫我們在發(fā)生特定事件的時候起到相應(yīng)的作用 Service組件,可以有多個,它是將Connector組件與Container組件包裝組合在一起,對外提供服務(wù)。該組件中會包含多個Connector組件組件以及一個Container組件。 Connector組件,隸屬于Service組件,可以有多個,如這里分別監(jiān)聽了HTTP/1.1西誒呦和AJP/1.3協(xié)議并分別綁定兩個獨(dú)立端口。將Socket請求過來的數(shù)據(jù),都封裝成Request請求對象,同時將該請求對象傳遞給容器進(jìn)行下一步的處理。 Engine引擎,用來管理多個站點(diǎn), 一個Service最多只能有一個Engine Host,代表一個站點(diǎn),也可以叫虛擬主機(jī)。它指定具體的服務(wù)的部署位置,如appBase指定了代碼的部署文件夾路徑,并且是否支持自動部署和自動解壓War包 Context :代表一個應(yīng)用程序,即為我們開發(fā)的一個war服務(wù)在webapp目錄下的各個應(yīng)用,或者一個WEB-INF 目錄以及下面的web.xml 文件; Wrapper :每個Wrapper 封裝著一個servlet。

HTTP請求處理流程
1、在用戶在瀏覽器中點(diǎn)擊頁面進(jìn)行數(shù)據(jù)請求后,Tomcat本機(jī)默認(rèn)端口8080接收到數(shù)據(jù)請求,被在那里監(jiān)聽的Coyote HTTP/1.1 Connector獲得;
2、Connector把封裝好的Request請求交由其所在的Service的Engine來處理,并等待Engine的回應(yīng);
3、Engine獲得請求localhost/test/index.jsp,匹配所有的虛擬主機(jī)Host;
4、Engine匹配到名為localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的默認(rèn)主機(jī)),名為localhost的Host獲得請求/test/index.jsp,匹配它所擁有的所有的Context。Host匹配到路徑為/test的Context(如果匹配不到就把該請求交給路徑名為“ ”的Context去處理);
5、path=“/test”的Context獲得請求/index.jsp,在它的mapping table中尋找出對應(yīng)的Servlet。Context匹配到URL PATTERN為*.jsp的Servlet,對應(yīng)于JspServlet類;
6、構(gòu)造HttpServletRequest對象和HttpServletResponse對象,作為參數(shù)調(diào)用JspServlet的doGet()或doPost().執(zhí)行業(yè)務(wù)邏輯、數(shù)據(jù)存儲等程序;
7、Context把執(zhí)行完之后的HttpServletResponse對象返回給Host;
8、Host把HttpServletResponse響應(yīng)對象返回至Engine;
9、Engine將HttpServletResponse響應(yīng)對象返回至Connector;
10、Connector將HttpServletResponse響應(yīng)對象返回給客戶端的瀏覽器。
Connector
Connector是Tomcat的核心組件,從這里 可以看到各種Connector的對比。主要參數(shù)如下:
maxThreads 默認(rèn)200,表示任意時刻能夠并行執(zhí)行的最大線程數(shù)
minSpareThreads 默認(rèn)值10,表示任意時刻處于running狀態(tài)的線程的最小值,包括idle和active兩種狀態(tài)的線程
maxConnections Tomcat能夠接收和處理的并發(fā)連接的最大值,超過這個值后的連接將會被放入一個queue中,等待有空閑線程調(diào)用。默認(rèn)值10000(NIO/NIO2)或8192(APR/native)
acceptCount 默認(rèn)值100,當(dāng)沒有空閑線程的時候新的TCP請求連接都會放入這個一個queue中,這個是隊列的長度值,超過就直接拒絕請求了
connectionTimeout 單位毫秒,超過這個值Connector將會釋放這個idle的連接
Connection Refused 錯誤。此時應(yīng)該對線程池的容量做適當(dāng)調(diào)整, 但也不能調(diào)整過大,防止服務(wù)器負(fù)載升高。Executor
RejectedExecutionException 錯誤。線程模型

Acceptor:接收socket線程,這里雖然是基于NIO的connector,但是在接收socket方面還是傳統(tǒng)的serverSocket.accept()方式, 獲得SocketChannel對象,然后封裝在一個tomcat的實現(xiàn)類org.apache.tomcat.util.net.NioChannel對象中。然后將NioChannel對象封裝在一個PollerEvent對象中,并將PollerEvent對象壓入events queue里。這里是個典型的生產(chǎn)者-消費(fèi)者模式,Acceptor與Poller線程之間通過queue通信,Acceptor是events queue的生產(chǎn)者, Poller是events queue的消費(fèi)者。 Poller:Poller線程中維護(hù)了一個Selector對象,NIO就是基于Selector來完成邏輯的。在connector中并不止一個Selector, 在socket的讀寫數(shù)據(jù)時,為了控制timeout也有一個Selector。可以先把Poller線程中維護(hù)的這個Selector標(biāo)為 主Selector 。Poller是NIO實現(xiàn)的主要線程。首先作為events queue的消費(fèi)者, 從queue中取出PollerEvent對象,然后將此對象中的channel以 OP_READ 事件注冊到 主Selector 中,然后主Selector執(zhí)行select操作, 遍歷出可以讀數(shù)據(jù)的socket,并從Worker線程池中拿到可用的Worker線程,然后將socket傳遞給Worker。 Worker :Worker線程拿到Poller傳過來的socket后,將socket封裝在SocketProcessor對象中。然后從Http11ConnectionHandler 中取出Http11NioProcessor對象,從Http11NioProcessor中調(diào)用CoyoteAdapter的邏輯。
References
https://www.datadoghq.com/blog/tomcat-architecture-and-performance/
https://cloud.tencent.com/developer/article/1103077
https://blog.csdn.net/Diamond_Tao/article/details/87389315
https://zhuanlan.zhihu.com/p/85448047
逆鋒起筆是一個專注于程序員圈子的技術(shù)平臺,你可以收獲最新技術(shù)動態(tài)、最新內(nèi)測資格、BAT等大廠大佬的經(jīng)驗、增長自身、學(xué)習(xí)資料、職業(yè)路線、賺錢思維,微信搜索逆鋒起筆關(guān)注!

奇怪,免費(fèi)版 IDEA 為什么不能使用 Tomcat 呢?
記一次線上商城系統(tǒng) Tomcat、JVM 高并發(fā)的優(yōu)化
??給個在看,是最大的支持??
