閱讀本文約需要6分鐘
大家好,我是你們的導師,經常看我朋友圈的同學應該知道,我每天會在微信上給大家免費提供以下服務!
1、長期為你提供最優質的學習資源!
2、給你解決技術問題!
3、每天在朋友圈裡分享優質的技術文章!
4、每周1、3、5送紙質書籍免費送給大家,每年至少送書800本書!
5、為大家推薦靠譜的就業機關!
請注意!我上面說的5點全部都是免費的!全網你應該找不到第二家吧!
當然,大家在我私人微信上問我問題,僅限回答web前端、java相關的。
---------------------------
好了,接下來開始今天的技術分享!上次老師跟大家分享了MySQL多版本并發控制MVCC機制的知識,今天跟大家分享下Tomcat線程模型分析及源碼解讀的知識。
1 四種線程模型
配置方法:在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結構
3 三種請求接受方式
Tomcat支援三種接收請求的處理方式:BIO、NIO、APR
1.BIO模式
阻塞式I/O操作,表示Tomcat使用的是傳統Java I/O操作(即Java.io包及其子包)。Tomcat7以下版本預設情況下是以bio模式運作的,由于每個請求都要建立一個線程來處理,線程開銷較大,不能處理高并發的場景,在三種模式中性能也最低。
啟動tomcat看到如下日志,表示使用的是BIO模式:
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模式,不需要額外修改
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詳解
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. 容器的包含關系
3.容器的架構設計
從前有一個接口叫 Lifecycle 它定義了所有容器的生命周期。
之後 LifecycleBase實作了這個接口,LifecycleMBeanBase繼承了LifecycleBase。
類圖中StandardServer,StandardService,Connector分别對應了server.xml配置檔案中的,,标簽。Tomcat啟動時會按照org.apache.catalina.startup.Catalina檔案中digester預先設定的順序與規則依次調用addXxx或setXxx加載并初始化這幾個類。
首先Container也實作了Lifecycle接口,ContainerBase繼承了LifecycleMBeanBase剩下的關系在圖中已經可以看出來了。Tomcat啟動時也會按照digester預先設定的順序與規則依次嵌套加載各個容器類。每當幾個容器類被調用addChild()方法時,都間接調用了ContainerBase類的addChild()方法,最終使用children,parent字段建立容器之間的包含關系。
今天就分享這麼多,關于Tomcat線程模型分析及源碼解讀,你學會了多少?歡迎在留言區評論,對于有價值的留言,我們都會一一回複的。如果覺得文章對你有一丢丢幫助,請點右下角【在看】,讓更多人看到該文章。