天天看點

tomcat源碼_Tomcat線程模型分析及源碼解讀

tomcat源碼_Tomcat線程模型分析及源碼解讀

    閱讀本文約需要6分鐘 

大家好,我是你們的導師,經常看我朋友圈的同學應該知道,我每天會在微信上給大家免費提供以下服務!

1、長期為你提供最優質的學習資源!

2、給你解決技術問題!

3、每天在朋友圈裡分享優質的技術文章!

4、每周1、3、5送紙質書籍免費送給大家,每年至少送書800本書!

5、為大家推薦靠譜的就業機關!

請注意!我上面說的5點全部都是免費的!全網你應該找不到第二家吧!

當然,大家在我私人微信上問我問題,僅限回答web前端、java相關的。

---------------------------

好了,接下來開始今天的技術分享!上次老師跟大家分享了MySQL多版本并發控制MVCC機制的知識,今天跟大家分享下Tomcat線程模型分析及源碼解讀的知識。

1 四種線程模型 

tomcat源碼_Tomcat線程模型分析及源碼解讀

配置方法:在tomcat conf 下找到server.xml,在

  • BIO: protocol =" org.apache.coyote.http11.Http11Protocol"NIO: protocol ="org.apache.coyote.http11.Http11NioProtocol"AIO: protocol ="org.apache.coyote.http11.Http11Nio2Protocol"APR: protocol ="org.apache.coyote.http11.Http11AprProtocol"
               

2 Connector結構

tomcat源碼_Tomcat線程模型分析及源碼解讀

3  三種請求接受方式 

Tomcat支援三種接收請求的處理方式:BIO、NIO、APR

1.BIO模式

阻塞式I/O操作,表示Tomcat使用的是傳統Java I/O操作(即Java.io包及其子包)。Tomcat7以下版本預設情況下是以bio模式運作的,由于每個請求都要建立一個線程來處理,線程開銷較大,不能處理高并發的場景,在三種模式中性能也最低。

啟動tomcat看到如下日志,表示使用的是BIO模式:

tomcat源碼_Tomcat線程模型分析及源碼解讀
tomcat源碼_Tomcat線程模型分析及源碼解讀

2.NIO模式

是java SE 1.4及後續版本提供的一種新的I/O操作方式(即java.nio包及其子包)。是一個基于緩沖區、并能提供非阻塞I/O操作的Java API,它擁有比傳統I/O操作(bio)更好的并發運作性能。在tomcat 8之前要讓Tomcat以nio模式來運作比較簡單,隻需要在Tomcat安裝目錄/conf/server.xml檔案中将如下配置:

<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" />
           

修改成

<Connector port="8080"   protocol="org.apache.coyote.http11.Http11NioProtocol"connectionTimeout="20000"redirectPort="8443" />
           

Tomcat8以上版本,預設使用的就是NIO模式,不需要額外修改 

tomcat源碼_Tomcat線程模型分析及源碼解讀
tomcat源碼_Tomcat線程模型分析及源碼解讀

3.apr模式

簡單了解,就是從作業系統級别解決異步IO問題,大幅度的提高伺服器的處理和響應性能, 也是Tomcat運作高并發應用的首選模式。 啟用這種模式稍微麻煩一些,需要安裝一些依賴庫,下面以在CentOS7 mini版環境下Tomcat-8.0.35為例,介紹安裝步聚:

APR 1.2+ development headers (libapr1-dev package)OpenSSL 0.9.7+ development headers (libssl-dev package)JNI headers from Java compatible JDK 1.4+GNU development environment (gcc, make)
           

4 容器整體架構源碼分析

1.server.xml詳解 

tomcat源碼_Tomcat線程模型分析及源碼解讀

xml代碼:

<?xml version="1.0" encoding="UTF-8"?>                                <Server port="8005" shutdown="SHUTDOWN">              <Listener className="org.apache.catalina.startup.VersionLoggerListener"/>        <Listener className="org.apache.catalina.security.SecurityListener" />          <Listener SSLEngine="on" 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"/>            <GlobalNamingResources>            <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>    GlobalNamingResources>                        <Service name="Catalina">                                                            <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"          maxThreads="150" minSpareThreads="4"/>                                              <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>                                          <Engine defaultHost="localhost" name="Catalina">                    <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>                    <Realm className="org.apache.catalina.realm.LockOutRealm">          <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>        Realm>                                        <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">                      <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log." suffix=".txt"/>                                                            <Context docBase="small_bug" path="/small_bug" reloadable="true" />Host>      Engine>    Service>  Server>  
           

2. 容器的包含關系

tomcat源碼_Tomcat線程模型分析及源碼解讀

3.容器的架構設計

從前有一個接口叫 Lifecycle 它定義了所有容器的生命周期。

tomcat源碼_Tomcat線程模型分析及源碼解讀

之後 LifecycleBase實作了這個接口,LifecycleMBeanBase繼承了LifecycleBase。

tomcat源碼_Tomcat線程模型分析及源碼解讀

類圖中StandardServer,StandardService,Connector分别對應了server.xml配置檔案中的,,标簽。Tomcat啟動時會按照org.apache.catalina.startup.Catalina檔案中digester預先設定的順序與規則依次調用addXxx或setXxx加載并初始化這幾個類。

tomcat源碼_Tomcat線程模型分析及源碼解讀

首先Container也實作了Lifecycle接口,ContainerBase繼承了LifecycleMBeanBase剩下的關系在圖中已經可以看出來了。Tomcat啟動時也會按照digester預先設定的順序與規則依次嵌套加載各個容器類。每當幾個容器類被調用addChild()方法時,都間接調用了ContainerBase類的addChild()方法,最終使用children,parent字段建立容器之間的包含關系。 

今天就分享這麼多,關于Tomcat線程模型分析及源碼解讀,你學會了多少?歡迎在留言區評論,對于有價值的留言,我們都會一一回複的。如果覺得文章對你有一丢丢幫助,請點右下角【在看】,讓更多人看到該文章。

tomcat源碼_Tomcat線程模型分析及源碼解讀
tomcat源碼_Tomcat線程模型分析及源碼解讀

繼續閱讀