国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運(yùn)營 > 程序猿必須知道的關(guān)于 Tomcat 的知識點(diǎn)

程序猿必須知道的關(guān)于 Tomcat 的知識點(diǎn)

時間:2023-07-12 08:24:02 | 來源:網(wǎng)站運(yùn)營

時間:2023-07-12 08:24:02 來源:網(wǎng)站運(yùn)營

程序猿必須知道的關(guān)于 Tomcat 的知識點(diǎn):

身為 Java 程序員,Tomcat 應(yīng)該算是我們接觸的最多的 web 容器了。同時,作為企業(yè)生產(chǎn)工具的 “八阿哥” 們,平常只顧著埋頭寫 BUG,哪有什么時間整理用過的知識點(diǎn)。今天,我將和大家一起梳理一下關(guān)于 Tomcat 的相關(guān)內(nèi)容,由淺入深,從入門到放棄。奧利給~!

一、HTTP 請求處理流程







如上圖所示:

  1. 用戶通過瀏覽器發(fā)起請求。
  2. 瀏覽器向目標(biāo)服務(wù)器發(fā)起 TCP 連接請求。
  3. 經(jīng)過三次握手后客戶端瀏覽器與目標(biāo)服務(wù)器成功建立 TCP 連接。(基于 Socket 實(shí)現(xiàn))
  4. 瀏覽器生成 HTTP 格式的數(shù)據(jù)包。
  5. 瀏覽器發(fā)送 TCP 請求數(shù)據(jù)包。(這個數(shù)據(jù)包的請求頭為 TCP 格式的請求頭,上一步封裝的HTTP 格式的數(shù)據(jù)包被作為 TCP 請求體傳送至服務(wù)器)
  6. 服務(wù)器解析 TCP 請求體中的 HTTP 數(shù)據(jù)包。
  7. 服務(wù)器處理請求,完成相關(guān)業(yè)務(wù)邏輯。
  8. 服務(wù)器生成 HTTP 格式的響應(yīng)數(shù)據(jù)包。
  9. 服務(wù)器將響應(yīng)數(shù)據(jù)包發(fā)送至客戶端瀏覽器。
  10. 瀏覽器解析 HTTP 格式的響應(yīng)數(shù)據(jù)包。(解析出的數(shù)據(jù)為靜態(tài)數(shù)據(jù)如:HTML、CSS、JS、圖片等)
  11. 瀏覽器渲染響應(yīng)結(jié)果,呈現(xiàn)靜態(tài)數(shù)據(jù)給用戶。

二、Tomcat 總體架構(gòu)說明







Tomcat 作為 Servlet 容器從軟件運(yùn)行角度看,主要可以分為兩大模塊,一個是 Http 請求接收、響應(yīng)模塊(Coyote),另一個是請求處理模塊,即從 Servlet 容器中獲取與請求對應(yīng)的處理方法并執(zhí)行(Catalina)。

Coyote 連接器包含以下兩個模塊:

  1. ProtocolHandler 協(xié)議處理接口。這個接口通過 EndpointProcessor ,實(shí)現(xiàn)針對具體協(xié)議的處 理能?。Tomcat 按照協(xié)議和 I/O 提供了6個實(shí)現(xiàn)類 : AjpNioProtocol ,AjpAprProtocolAjpNio2Protocol , Http11NioProtocol ,Http11Nio2ProtocolHttp11AprProtocol
2. Adapter 由于請求協(xié)議的不同,客戶端發(fā)送至后臺的請求信息也不盡相同。為了能夠轉(zhuǎn)換成統(tǒng)一的 ServletRequestServletResponse 對象方便 Servlet 容器處理業(yè)務(wù),則需要該接口的實(shí)現(xiàn)類,對發(fā)送至 Tomcat 的請求進(jìn)行統(tǒng)一的適配處理。進(jìn)而使調(diào)用 Servlet 容器中的方法變的簡單。


Servlet 容器又名 Catalina。一個 Catalina 實(shí)例只能擁有一個 Server 實(shí)例,一個 Server 實(shí)例可以包含多個 Service 實(shí)例。而每一個 Service 實(shí)例又可以包含多個 Connector 和一個 Container。一個 Container 只能有一個 Engine,一個 Engine 可以有多個 Host ,每個 Host 可以包含多個 Context (網(wǎng)站),每個 Context 中可以有多個 WrapperServlet)。

  1. Catalina 實(shí)例可以被看成就是一個 Tomcat 實(shí)例。該實(shí)例用以解析 server.xml 配置文件, 以此來創(chuàng)建服務(wù)器Server組件并進(jìn)?管理。
  2. Server 表示整個 Catalina Servlet 容器以及其它組件,負(fù)責(zé)組裝并啟動 Servlaet 引擎,Tomcat 連接器。
  3. ServiceServer 內(nèi)部的組件,?個 Server 包含多個 Service。它將若?個 Connector 組件綁定到?個 Container。(通常情況下只用一個 Service 就夠了)
  4. Container 負(fù)責(zé)處理?戶的 servlet 請求,并將處理結(jié)果返回給用戶。
Tips

上述組件的配置其實(shí)就體現(xiàn)在 Tomcat 軟件中的 conf/server.xml 里。

三、Tomcat 核心配置文件 server.xml

問個實(shí)在的問題:當(dāng)你第一次甚至說上一次看 Tomcat 的配置文件 server.xml 時,你的第一感受是啥?反正我最真切的感受就是:“我靠,英文真多~!”。不過靜下心來再看,更多的都是說明性文字。刪除注釋后再看,就跟被拔光毛的雞一樣,也就那樣。不信你看

<?xml version="1.0" encoding="UTF-8"?><!-- port:關(guān)閉服務(wù)器的監(jiān)聽端? shutdown:關(guān)閉服務(wù)器的指令字符串 --><Server port="8005" shutdown="SHUTDOWN"> <!-- 以?志形式輸出服務(wù)器 、操作系統(tǒng)、JVM的版本信息 --> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <!-- 加載(服務(wù)器啟動)和銷毀(服務(wù)器停?)APR。如果找不到 APR 庫,則會輸出?志,但并不影響 Tomcat 啟動 --> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <!-- 避免JRE內(nèi)存泄漏問題 --> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <!-- 加載(服務(wù)器啟動)和銷毀(服務(wù)器停?)全局命名服務(wù) --> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <!-- 在Context停?時重建 Executor 池中的線程,以避免 ThreadLocal 相關(guān)的內(nèi)存泄漏 --> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <!-- 全局命名服務(wù),定義服務(wù)器的全局 JNDI 資源 --> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <!-- 處理 HTTP/1.1 協(xié)議的請求 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!-- 處理 AJP/1.3 協(xié)議的請求 用不到的話可以注釋掉 --> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase" /> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /> </Host> </Engine> </Service></Server>這么一整理是不是瞬間清爽了很多。需要注意的是,通常情況下,上面配置文件里添加了注釋的部分,除了 Connector 標(biāo)簽中的參數(shù),其他標(biāo)簽的內(nèi)容一般不需要修改,保持默認(rèn)即可。

四、核心配置文件進(jìn)階

4-1 <Service> 標(biāo)簽

<Service name="Catalina"> ...</Service>該標(biāo)簽?于創(chuàng)建 Service 實(shí)例,默認(rèn)使? org.apache.catalina.core.StandardService 對象。默認(rèn)情況下,Tomcat 僅指定了 Service 的名稱, 值為 "Catalina"。 Service ?標(biāo)簽有 : Listener、ExecutorConnector、Engine。其中:

4-2 <Executor> 標(biāo)簽

該標(biāo)簽用于為 Service 添加線程池。默認(rèn)情況下,在 server.xml 文件中,該標(biāo)簽是被注釋掉的,即未開啟線程池的。如果想開啟,則打開注釋,并配置相關(guān)屬性即可。

<Executor name="commonThreadPool" namePrefix="thread-exec-" maxThreads="200" minSpareThreads="100" maxIdleTime="60000" maxQueueSize="Integer.MAX_VALUE" prestartminSpareThreads="false" threadPriority="5" className="org.apache.catalina.core.StandardThreadExecutor"/><Executor> 標(biāo)簽屬性含義

4-3 <Connector> 標(biāo)簽

該?于創(chuàng)建鏈接器實(shí)例默認(rèn)情況下,server.xml 配置了兩個鏈接器,?個?持 HTTP 協(xié)議,?個?持 AJP 協(xié)議?多數(shù)情況下,我們并不需要新增鏈接器配置,只是根據(jù)需要對已有鏈接器進(jìn)?優(yōu)化。

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" executor="commonThreadPool" URIEncoding="UTF-8" minSpareThreads="100" maxThreads="1000" acceptCount="1000" maxConnections="1000" compression="on" compressionMinSize="2048" disableUploadTimeout="true" /><Connector> 標(biāo)簽屬性含義

4-4 <Engine> 標(biāo)簽

<Engine name="Catalina" defaultHost="localhost"> ...</Engine>該標(biāo)簽表示 Servlet 引擎。其屬性 name ?于指定 Engine 的名稱, 默認(rèn)為CatalinadefaultHost 屬性用于指定默認(rèn)使?的虛擬主機(jī)名稱,當(dāng)客戶端請求指向的主機(jī)?效時,將交由默認(rèn)的虛擬主機(jī)處理,默認(rèn)為值 localhost。

4-5 <Host> 標(biāo)簽

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> ...</Host>該標(biāo)簽用于配置?個虛擬主機(jī)。

4-6 <Context> 標(biāo)簽

<Host name="www.abc.com" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Context docBase="/Users/yingdian/web_demo" path="/web_demo"></Context> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /></Host><Host> 標(biāo)簽中的 <Context> 標(biāo)簽用于配置一個 Web 應(yīng)用。

五、Tomcat 配置 HTTPS

  1. 使? JDK 中的 keytool ?具?成免費(fèi)的秘鑰庫?件(證書)。
keytool -genkey -alias SupremeSir -keyalg RSA -keystore supreme.keystore







2. 配置 server.xml

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" schema="https" secure="true" SSLEnabled="true"> <SSLHostConfig> <Certificate certificateKeystoreFile="E:/**/apache-tomcat/bin/supreme.keystore" certificateKeystorePassword="123456" type="RSA"/> </SSLHostConfig></Connector>certificateKeystoreFile:指定證書所在位置。

certificateKeystorePassword:指定證書秘鑰庫口令。

六、Tomcat 性能優(yōu)化

Tomcat 優(yōu)化沒有明確的參數(shù)值可以直接去使?,必須根據(jù)??的真實(shí)?產(chǎn)環(huán)境來進(jìn)?調(diào)整,調(diào)優(yōu)是?個過程。調(diào)優(yōu)主要從兩個??進(jìn)?:

  1. JVM 虛擬機(jī)優(yōu)化(優(yōu)化內(nèi)存模型)
  2. Tomcat ?身配置的優(yōu)化

6-1 Java 虛擬機(jī)內(nèi)存相關(guān)參數(shù)

參數(shù)參數(shù)作用優(yōu)化建議
-server啟動Server,以服務(wù)端模式運(yùn)?服務(wù)端模式建議開啟
-Xms最?堆內(nèi)存建議與-Xmx設(shè)置相同
-Xmx最?堆內(nèi)存建議設(shè)置為可?內(nèi)存的80%
-XX:MetaspaceSize元空間初始值自行調(diào)整
-XX:MaxMetaspaceSize元空間最?內(nèi)存默認(rèn)?限
-XX:NewRatio年輕代和?年代???值,取值為整數(shù),默認(rèn)為2不需要修改
-XX:SurvivorRatioEden區(qū)與Survivor區(qū)??的?值,取值為整數(shù),默認(rèn)為8不需要修改
bin/catalina.sh 的腳本中 , 追加如下配置

JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"

6-2 垃圾收集器

  1. 串?收集器(Serial Collector
單線程執(zhí)?所有的垃圾回收?作, 適?于單核CPU服務(wù)器。

2. 并?收集器(Parallel Collector

?稱為吞吐量收集器(關(guān)注吞吐量), 以并?的?式執(zhí)?年輕代的垃圾回收, 該?式可以顯著降 低垃圾回收的開銷(指多條垃圾收集線程并??作,但此時?戶線程仍然處于等待狀態(tài))。適?于多 處理器或多線程硬件上運(yùn)?的數(shù)據(jù)量較?的應(yīng)?。

3. 并發(fā)收集器(Concurrent Collector

以并發(fā)的?式執(zhí)??部分垃圾回收?作,以縮短垃圾回收的暫停時間。適?于那些響應(yīng)時間優(yōu)先于 吞吐量的應(yīng)?, 因?yàn)樵撌占麟m然最?化了暫停時間(指?戶線程與垃圾收集線程同時執(zhí)?,但不? 定是并?的,可能會交替進(jìn)?), 但是會降低應(yīng)?程序的性能。

4. CMS 收集器(Concurrent Mark Sweep Collector

并發(fā)標(biāo)記清除收集器, 適?于那些更愿意縮短垃圾回收暫停時間并且負(fù)擔(dān)的起與垃圾回收共享處 理器資源的應(yīng)?

5. G1 收集器(Garbage-First Garbage Collector

適?于?容量內(nèi)存的多核服務(wù)器, 可以在滿?垃圾回收暫停時間?標(biāo)的同時, 以最?可能性實(shí)現(xiàn) ?吞吐量(JDK1.7 之后)

垃圾回收器參數(shù)

參數(shù)描述
-XX:+UseSerialGC啟?串?收集器
-XX:+UseParallelGC啟?并?垃圾收集器,配置了該選項(xiàng),那么 -XX:+UseParallelOldGC默認(rèn)啟?
-XX:+UseParNewGC年輕代采?并?收集器,如果設(shè)置了 -XX:+UseConcMarkSweepGC選項(xiàng),?動啟?
-XX:ParallelGCThreads年輕代及?年代垃圾回收使?的線程數(shù)。默認(rèn)值依賴于JVM使?的CPU個數(shù)
-XX:+UseConcMarkSweepGC對于?年代,啟?CMS垃圾收集器。 當(dāng)并?收集器?法滿?應(yīng)?的延遲需求時,
推薦使?CMS或G1收集器。啟?該選項(xiàng)后,-XX:+UseParNewGC?動啟?。
-XX:+UseG1GC啟?G1收集器。 G1是服務(wù)器類型的收集器, ?于多核、?內(nèi)存的機(jī)器。
它在保持?吞吐量的情況下,?概率滿?GC暫停時間的?標(biāo)。
bin/catalina.sh 的腳本中 , 追加如下配置:

sh JAVA_OPTS="-XX:+UseConcMarkSweepGC"

如果存在虛擬機(jī)內(nèi)存相關(guān)參數(shù)配置,則直接在 JAVA_OPTS 中追加即可。

6-3 Tomcat 配置調(diào)優(yōu)

  1. 啟用 Tomcat 線程池
  2. 調(diào)整 Tomcat 的連接器
調(diào)整 Tomcat/conf/server.xml 中關(guān)于鏈接器的配置可以提升應(yīng)?服務(wù)器的性能。

參數(shù)說明
maxConnections最?連接數(shù),當(dāng)?shù)竭_(dá)該值后,服務(wù)器接收但不會處理更多的請求, 額外的請求將會阻塞直到連接數(shù)低于maxConnections 。可通過ulimit -a 查看服務(wù)器限制。對于CPU要求更?(計(jì)算密集型)時,建議不要配置過? ; 對于CPU要求不是特別?時,建議配置在2000左右(受服務(wù)器性能影響)。 當(dāng)然這個需要服務(wù)器硬件的?持
maxThreads最?線程數(shù),需要根據(jù)服務(wù)器的硬件情況,進(jìn)??個合理的設(shè)置
acceptCount最?排隊(duì)等待數(shù),當(dāng)服務(wù)器接收的請求數(shù)量到達(dá)maxConnections ,此時Tomcat會將后?的請求,存放在任務(wù)隊(duì)列中進(jìn)?排序, acceptCount指的就是任務(wù)隊(duì)列中排隊(duì)等待的請求數(shù) 。 ?臺Tomcat的最?的請求處理數(shù)量,是maxConnections + acceptCount
3. 禁? AJP 連接器




4. 調(diào)整 IO 模式

Tomcat8 之前的版本默認(rèn)使? BIO(阻塞式 IO),對于每?個請求都要創(chuàng)建?個線程來處理,不適合?并發(fā);Tomcat8 以后的版本默認(rèn)使? NIO 模式(?阻塞式 IO)。




當(dāng) Tomcat 并發(fā)性能有較?要求或者出現(xiàn)瓶頸時,我們可以嘗試使? APR 模式,APRApache Portable Runtime)是從操作系統(tǒng)級別解決異步 IO 問題,使?時需要在操作系統(tǒng)上安裝 APRNative(因?yàn)?APR 原理是使?使? JNI 技術(shù)調(diào)?操作系統(tǒng)底層的 IO 接?)。

5. 動靜分離

可以使? Nginx + Tomcat 相結(jié)合的部署?案,Nginx 負(fù)責(zé)靜態(tài)資源訪問,Tomcat 負(fù)責(zé) Jsp 等動態(tài)資 源訪問處理(因?yàn)?Tomcat 不擅?處理靜態(tài)資源)。

源碼

源碼下載

關(guān)鍵詞:知識,程序,須知

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉