<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          一文徹底搞懂 Tomcat !

          共 5442字,需瀏覽 11分鐘

           ·

          2021-08-15 23:14

          微信搜索逆鋒起筆關(guān)注后回復(fù)編程pdf

          領(lǐng)取編程大佬們所推薦的 23 種編程資料!

          本文來源:http://r6d.cn/abLgw


          Tomcat是做Java Web開發(fā)時部署服務(wù)最受歡迎的容器,關(guān)于它的運(yùn)行機(jī)制和調(diào)優(yōu)參數(shù)本文進(jìn)行一定的整理。

          Architecture

          配置

          一個經(jīng)典的配置文件如下所示:
          <?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>
          我們可以看到它的結(jié)構(gòu):
          • 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。
          可以從更深層次的視角來查看架構(gòu):

          HTTP請求處理流程

          當(dāng)一個HTTP請求到達(dá)Tomcat后,所經(jīng)歷的大致流程如下:
          • 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的連接

          Tomcat啟動的時候會首先創(chuàng)建minSpareThreads個線程,然后隨著負(fù)載的增加一直增加到maxThreads,如果此時所有線程都處于busy狀態(tài),此后再來的 請求將會被放入queue中(最大容納acceptCount)直到有空閑線程來執(zhí)行。當(dāng)queue滿了并且連接數(shù)量達(dá)到了maxConnections,后續(xù)再連接進(jìn)來的connection將收到 Connection Refused 錯誤。此時應(yīng)該對線程池的容量做適當(dāng)調(diào)整, 但也不能調(diào)整過大,防止服務(wù)器負(fù)載升高。

          Executor

          它可以更好的在多個Connector之間控制和調(diào)度線程池的資源,也便于控制服務(wù)器的負(fù)載。它的機(jī)制和Connector中的默認(rèn)線程池一樣,使用最小和最大線程池參數(shù)控制線程個數(shù), 并通過maxQueueSize控制隊列的大小,如果超過了能夠容納的容量,則拋出 RejectedExecutionException 錯誤。

          線程模型

          對照下面這張圖,可以比較清晰的理解tomcat的Connector和nio模型:
          • 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)注!



          6張時序圖!談?wù)凾omcat請求處理流程

          奇怪,免費(fèi)版 IDEA 為什么不能使用 Tomcat 呢?

          記一次線上商城系統(tǒng) Tomcat、JVM 高并發(fā)的優(yōu)化


          ??給個在看,是最大的支持??
          瀏覽 38
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天干天天一 | 超碰国产操逼 | 日皮视频免费在线观看 | 国产一级乱伦 | 亚洲激情AV |