時間:2023-07-15 07:06:01 | 來源:網(wǎng)站運營
時間:2023-07-15 07:06:01 來源:網(wǎng)站運營
中間件01--Tomcat:本篇文章內(nèi)容借鑒于拉勾教育Java高薪訓練營課程。Tomcat模型3、Tomcat Servlet容器處理流程
1)HTTP服務器會把請求信息用ServletRequest對象封裝起來,進一步去調(diào)用Servlet容器中某個具體的Servlet;,2)Servlet容器拿到請求后,根據(jù)URL和Servlet的映射關系,找到相應的servlet;3) 如果servlet還沒有被加載,就用反射機制創(chuàng)建這個Servlet,并調(diào)用Servlet的init方法來初始化;4)接著調(diào)用具體Servlet的service方法來處理請求,請求處理結(jié)果使用ServletResponse封裝;5)把ServletResponse對象返回給HTTP服務器,HTTP服務器會把響應發(fā)送給客戶端。
4、Tomcat 系統(tǒng)總體架構(gòu)(1)Coyote 封裝了底層的?絡通信(Socket 請求及響應處理);(2)Coyote 使Catalina 容器(容器組件)與具體的請求協(xié)議及IO操作?式完全解耦;(3)Coyote 將Socket 輸?轉(zhuǎn)換封裝為 Request 對象,進?步封裝后交由Catalina 容器進?處理,處理請求完成后, Catalina 通過Coyote 提供的Response 對象將結(jié)果寫?輸出流;(4)Coyote 負責的是具體協(xié)議(應?層)和IO(傳輸層)相關內(nèi)容;
Tomcat?持多種應?層協(xié)議和I/O模型,如下:組件 | 作用描述 |
---|---|
EndPoint | EndPoint 是 Coyote 通信端點,即通信監(jiān)聽的接?,是具體Socket接收和發(fā) 送處理器,是對傳輸層的抽象,因此EndPoint?來實現(xiàn)TCP/IP協(xié)議的 |
Processor | Processor 是Coyote 協(xié)議處理接? ,如果說EndPoint是?來實現(xiàn)TCP/IP協(xié) 議的,那么Processor?來實現(xiàn)HTTP協(xié)議,Processor接收來?EndPoint的Socket,讀取字節(jié)流解析成Tomcat Request和Response對象,并通過Adapter將其提交到容器處理,Processor是對應?層協(xié)議的抽象 |
ProtocolHandler | Coyote 協(xié)議接?, 通過Endpoint 和 Processor , 實現(xiàn)針對具體協(xié)議的處 理能?。Tomcat 按照協(xié)議和I/O 提供了6個實現(xiàn)類 : AjpNioProtocol ,AjpAprProtocol, AjpNio2Protocol , Http11NioProtocol ,Http11Nio2Protocol ,Http11AprProtocol |
Adapter | 由于協(xié)議不同,客戶端發(fā)過來的請求信息也不盡相同,Tomcat定義了??的 Request類來封裝這些請求信息。ProtocolHandler接?負責解析請求并?成Tomcat Request類。但是這個Request對象不是標準的ServletRequest,不能?Tomcat Request作為參數(shù)來調(diào)?容器。Tomcat設計者的解決?案是引?CoyoteAdapter,這是適配器模式的經(jīng)典運?,連接器調(diào)?CoyoteAdapter的Sevice?法,傳?的是Tomcat Request對象,CoyoteAdapter負責將Tomcat Request轉(zhuǎn)成ServletRequest,再調(diào)?容器 |
<!--Server 根元素,創(chuàng)建?個Server實例,?標簽有 Listener、GlobalNamingResources、Service--><Server> <!--定義監(jiān)聽器--> <Listener/> <!--定義服務器的全局JNDI資源 --> <GlobalNamingResources/> <!--定義?個Service服務,?個Server標簽可以有多個Service服務實例--> <Service/></Server>
1、Server 標簽<!-- port:關閉服務器的監(jiān)聽端? shutdown:關閉服務器的指令字符串--><Server port="8005" shutdown="SHUTDOWN"><!-- 以?志形式輸出服務器 、操作系統(tǒng)、JVM的版本信息 --><Listener className="org.apache.catalina.startup.VersionLoggerListener" /><!-- Security listener. Documentation at /docs/config/listeners.html <Listener className="org.apache.catalina.security.SecurityListener" />--><!--APR library loader. Documentation at /docs/apr.html --><!-- 加載(服務器啟動) 和 銷毀 (服務器停?) APR。 如果找不到APR庫, 則會輸出?志,并不影響 Tomcat啟動 --><Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /><!-- Prevent memory leaks due to use of particular java/javax APIs--><!-- 避免JRE內(nèi)存泄漏問題 --><Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /><!-- 加載(服務器啟動) 和 銷毀(服務器停?) 全局命名服務 --><Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /><!-- 在Context停?時重建 Executor 池中的線程, 以避免ThreadLocal 相關的內(nèi)存泄漏 --><Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /><!-- Global JNDI resources Documentation at /docs/jndi-resources-howto.html GlobalNamingResources 中定義了全局命名服務--><GlobalNamingResources><!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users--> <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><!-- A "Service" is a collection of one or more "Connectors" that share a single "Container" Note: A "Service" is not itself a "Container", so you may not define subcomponents such as "Valves" at this level.Documentation at /docs/config/service.html--><Service name="Catalina">...</Service></Server>
2、Service 標簽<!-- 該標簽?于創(chuàng)建 Service 實例,默認使? org.apache.catalina.core.StandardService。 默認情況下,Tomcat 僅指定了Service 的名稱, 值為 "Catalina"。 Service ?標簽為 : Listener、Executor、Connector、Engine, 其中: Listener ?于為Service添加?命周期監(jiān)聽器, Executor ?于配置Service 共享線程池, Connector ?于配置Service 包含的鏈接器, Engine ?于配置Service中鏈接器對應的Servlet 容器引擎--><Service name="Catalina">...</Service>
3、Executor 標簽<!-- 默認情況下,Service 并未添加共享線程池配置。 如果我們想添加?個線程池, 可以在 <Service> 下添加如下配置: name:線程池名稱,?于 Connector中指定 namePrefix:所創(chuàng)建的每個線程的名稱前綴,?個單獨的線程名稱為 namePrefix+threadNumber maxThreads:池中最?線程數(shù) minSpareThreads:活躍線程數(shù),也就是核?池線程數(shù),這些線程不會被銷毀,會?直存在 maxIdleTime:線程空閑時間,超過該時間后,空閑線程會被銷毀,默認值為6000(1分鐘),單位毫秒 maxQueueSize:在被執(zhí)?前最?線程排隊數(shù)?,默認為Int的最?值,也就是?義的?限。除?特殊情況,這個值 不需要更改,否則會有請求不會被處理的情況發(fā)? prestartminSpareThreads:啟動線程池時是否啟動 minSpareThreads部分線程。默認值為false,即不啟動 threadPriority:線程池中線程優(yōu)先級,默認值為5,值從1到10 className:線程池實現(xiàn)類,未指定情況下,默認實現(xiàn)類為org.apache.catalina.core.StandardThreadExecutor。如果想使??定義線程池?先需要實現(xiàn)org.apache.catalina.Executor接?--><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"/>
4、Connector 標簽<!-- port:端?號,Connector ?于創(chuàng)建服務端Socket 并進?監(jiān)聽, 以等待客戶端請求鏈接。如果該屬性設置為0, Tomcat將會隨機選擇?個可?的端?號給當前Connector 使? protocol:當前Connector ?持的訪問協(xié)議。 默認為 HTTP/1.1 , 并采??動切換機制選擇?個基于 JAVA NIO 的鏈接器或者基于本地APR的鏈接器(根據(jù)本地是否含有Tomcat的本地庫判定) connectionTimeOut:Connector 接收鏈接后的等待超時時間, 單位為 毫秒。 -1 表示不超時。 redirectPort:當前Connector 不?持SSL請求, 接收到了?個請求, 并且也符合security-constraint 約束,需要SSL傳輸,Catalina?動將請求重定向到指定的端?。 executor:指定共享線程池的名稱, 也可以通過maxThreads、minSpareThreads 等屬性配置內(nèi)部線程池。可以使?共享線程池 Engine 標簽:Engine 表示 Servlet 引擎 Host 標簽:Host 標簽?于配置?個虛擬主機 URIEncoding: ?于指定編碼URI的字符編碼, Tomcat8.x版本默認的編碼為 UTF-8 , Tomcat7.x版本默認為ISO-8859-1--><!--org.apache.coyote.http11.Http11NioProtocol , ?阻塞式 Java NIO 鏈接器--><Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /><Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
可以使?共享線程池<Connector port="8080" protocol="HTTP/1.1" executor="commonThreadPool" maxThreads="1000" minSpareThreads="100" acceptCount="1000" maxConnections="1000" connectionTimeout="20000" compression="on" compressionMinSize="2048" disableUploadTimeout="true" redirectPort="8443" URIEncoding="UTF-8" />
5、Engine 標簽<!--name:?于指定Engine 的名稱, 默認為Catalina;defaultHost:默認使?的虛擬主機名稱, 當客戶端請求指向的主機?效時, 將交由默認的虛擬主機處理, 默認為localhost--><Engine name="Catalina" defaultHost="localhost">...</Engine>
6、Host 標簽<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">...</Host>
7、Context 標簽<Host name="www.abc.com" appBase="webapps" unpackWARs="true" autoDeploy="true"><!-- docBase:Web應??錄或者War包的部署路徑??梢允墙^對路徑,也可以是相對于 Host appBase的相對路徑。 path:Web應?的Context 路徑。如果我們Host名為localhost, 則該web應?訪問的根路徑為: http://localhost:8080/web_demo。--><Context docBase="/Users/yingdian/web_demo" path="/web3"></Context><Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /></Host>
1、?先從 Bootstrap Classloader加載指定的類2、如果未加載到,則從 /WEB-INF/classes加載3、如果未加載到,則從 /WEB-INF/lib/*.jar 加載4、如果未加載到,則依次從 System、Common、Shared 加載(在這最后?步,遵從雙親委派機制)
1:我們的請求被發(fā)送到本機端口8080,被在那里偵聽的Coyote HTTP/1.1 Connector獲得。2:Connector把該請求交給它所在的Service的Engine來處理,并等待來自Engine的回應 。3:Engine獲得請求localhost/my-web-maven/index.jsp,匹配它所擁有的所有虛擬主機Host ,我們的虛擬主機在server.xml中默認配置的就是localhost。4:Engine匹配到name=localhost的Host(即使匹配不到也把請求交給該Host處理,因為該Host被定義為該Engine的默認主機)。5:localhost Host獲得請求/my-web-maven/index.jsp,匹配它所擁有的所有Context。6:Host匹配到路徑為/my-web-maven的Context。7:path=”/my-web-maven”的Context獲得請求/index.jsp,在它的mapping table中尋找對應的servlet 。8:Context匹配到URL PATTERN為*.jsp的servlet,對應于JspServlet類。9:構(gòu)造HttpServletRequest對象和HttpServletResponse對象,作為參數(shù)調(diào)用JspServlet的doGet或doPost方法 。10:Context把執(zhí)行完了之后的HttpServletResponse對象返回給Host 。11:Host把HttpServletResponse對象返回給Engine 。12:Engine把HttpServletResponse對象返回給Connector 。13:Connector把HttpServletResponse對象返回給客戶browser 。
1、HTTPS協(xié)議使?時需要到電?商務認證授權(quán)機構(gòu)(CA)申請SSL證書;2、HTTP默認使?8080端?,HTTPS默認使?8443端?;3、HTTPS則是具有SSL加密的安全性傳輸協(xié)議,對數(shù)據(jù)的傳輸進?加密,效果上相當于HTTP的升級版;4、HTTP的連接是?狀態(tài)的,不安全的;HTTPS協(xié)議是由SSL+HTTP協(xié)議構(gòu)建的可進?加密傳輸、身份認證的?絡協(xié)議,?HTTP協(xié)議安全。
3、HTTPS?作原理大致流程:1、bin目錄主要是用來存放tomcat的命令,主要有兩大類,一類是以.sh結(jié)尾的(linux命令),另一類是以.bat結(jié)尾的(windows命令)。很多環(huán)境變量的設置都在此處。2、conf目錄主要是用來存放tomcat的一些配置文件。 server.xml可以設置端口號、設置域名或IP、默認加載的項目、請求編碼 web.xml可以設置tomcat支持的文件類型 context.xml可以用來配置數(shù)據(jù)源之類的 tomcat-users.xml用來配置管理tomcat的用戶與權(quán)限 在Catalina目錄下可以設置默認加載的項目3、lib目錄主要用來存放tomcat運行需要加載的jar包。4、logs目錄用來存放tomcat在運行過程中產(chǎn)生的日志文件,非常重要的是在控制臺輸出的日志。(清空不會對tomcat運行帶來影響)5、temp目錄用戶存放tomcat在運行過程中產(chǎn)生的臨時文件。(清空不會對tomcat運行帶來影響)。6、webapps目錄用來存放應用程序,當tomcat啟動時會去加載webapps目錄下的應用程序。可以以文件夾、war包、jar包的形式發(fā)布應用。7、work目錄用來存放tomcat在運行時的編譯后文件,例如JSP編譯后的.java和.class文件。一個客戶端訪問后編譯后的文件存放在這,下一個客戶端再次訪問可以直接返回,不用再次編譯程序。清空work目錄,然后重啟tomcat,可以達到清除緩存的作用。如果項目下包含文件卻一直報找不到的異常,可以清空該文件夾下的內(nèi)容,然后重新編譯,便可以得到解決。
關鍵詞:中間
微信公眾號
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。