电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Tomcat請求處理流程與源碼淺析(最新推薦)

瀏覽:134日期:2023-09-08 20:45:27
目錄Tomcat請求處理流程與源碼淺析一丶Connector二丶NioEndpoint 初始化ServerSocketChannel三丶NioEndpoint 啟動Poller和Acceptor線程四丶Acceptor接收請求1.endpoint.countUpOrAwaitConnection()限制連接數2.NioEndpoint#serverSocketAccept 接收Socket連接3.NioEndpoint#setSocketOptions將SocketChannel注冊到Poller五丶Poller處理事件1.events方法查看事件隊列是否具備事件2.Poller 使用Selector進行select3.Poller 處理就緒IO六丶CoyoteAdapter處理請求1.使用Mapper找到請求對應的Host,Context,Wrapper2.Pipeline執行3.FilterChain執行Tomcat請求處理流程與源碼淺析

一丶Connector

在tomcat中,Connector負責開啟socket并且監聽客戶端請求,返回響應數據。

其中:

Endpoint:tomcat中沒有這個接口,只有AbstractEndpoint,它負責啟動線程來監聽服務器端口,并且在接受到數據后交給Processor處理Processor:Processor讀取到客戶端請求后按照請求地址映射到具體的容器進行處理,這個過程請求映射,Processor實現請求映射依賴于Mapper對象,在容器發生注冊和注銷的時候,MapperListener會監聽到對應的事件,從而來變更Mapper中維護的請求映射信息。ProtocolHandler:協議處理器,針對不同的IO方式(NIO,BIO等)和不同的協議(Http,AJP)具備不同的實現,ProtocolHandler包含一個Endpoint來開啟端口監聽,并且包含一個Processor用于按照協議讀取數據并將請求交給容器處理。Acceptor:Acceptor實現了Runnable接口,可以作為一個線程啟動,使用Socket API監聽指定端口,用于接收用戶請求。Poller:主要用于監測注冊在原始 scoket 上的事件是否發生,Acceptor接受到請求后,會注冊到Poller的隊列中。二丶NioEndpoint 初始化ServerSocketChannel

springboot內嵌tomcat,一般默認使用NioEndpoint,在NioEndpoint#start方法中,會觸發NioEndpoint#bind

三丶NioEndpoint 啟動Poller和Acceptor線程

NioEndpoint#start方法最后會觸發Poller線程和Acceptor線程的啟動

可以看到NioEndpoint內部的Poller,和Acceptor都是單獨使用一個守護線程來運行。

四丶Acceptor接收請求

1.endpoint.countUpOrAwaitConnection()限制連接數

其內部使用LimitLatch#countUpOrAwait方法限制連接數,如果連接數達到了上限,那將掛起當前線程,也就是掛起Acceptor線程,從而導致無法有更多的請求連接上來,最大連接數默認為8*1024。

LimitLatch 內部持有一個AbstractQueuedSynchronizer,限制連接數將調用其acquireSharedInterruptibly(1),然后會調用到AQS的tryAcquireShared,其內部使用AtomicLong來進行連接的計數。

2.NioEndpoint#serverSocketAccept 接收Socket連接

由于NioEndpoint前面調用了ServerSocketChannel#configureBlocking(true),所以serverSock#accept,在沒有連接上來時,不會立馬返回null,而是阻塞直到連接來到。

3.NioEndpoint#setSocketOptions將SocketChannel注冊到Poller

在Acceptor線程接收到SocketChannel后,會調用Poller#register方法進行注冊,Acceptor只負責接受請求,請求后續的處理由Poller線程負責

最終請求被包裝為PollerEvent丟到Poller的事件隊列SynchronizedQueue中,SynchronizedQueue使用synchronized保證線程安全。

wakeupCounter 是AtomicLong類型,Acceptor接受到請求,將請求封裝為PollerEvent后會調用wakeupCounter#incrementAndGet方法,進行+1操作

Poller在使用Selector,進行IO多路復用的時候,會進行如下操作

可以看到,如果wakeupCounter大于0,Poller會調用 selector.selectNow()(非阻塞立馬返回),反之調用selector.select(selectorTimeout)(超時并阻塞)。

也就說Acceptor接受到請求越多,wakeupCounter越大,越會讓Poller調用selector.selectNow()減少阻塞,從而讓Poller更快的檢查事件是否就緒,從而讓請求更及時的被處理。

五丶Poller處理事件1.events方法查看事件隊列是否具備事件

上面我們說到Acceptor在建立連接后,將SocketChannel包裝成NioSocketWrapper塞到了Poller的事件隊列中。而Poller線程則會一直輪詢這個隊列進行事件的獲取

2.Poller 使用Selector進行select

通過Selector獲取獲取當前就緒的IO,keyCount記錄就緒數目。

3.Poller 處理就緒IO

processKey會調用到processSocket,最終使用tomcat線程池中的線程進行異步處理

最終會找到Processor進行處理(默認使用緩存的,避免重復new對象,頻繁gc,如果緩存沒有那么使用ProtocolHandler 創建出一個),這里的Processor就是Http11Processor

然后根據事件類型進行不同的處理,如果是讀事件那么會調用Http11Processor#service進行處理,然后會繼續交給CoyoteAdapter調用其service進行處理。

六丶CoyoteAdapter處理請求1.使用Mapper找到請求對應的Host,Context,Wrapper

下圖是的模型,如果使用了SpringMVC,這里的Wrapper會存在DispatchServlet

如下是Mapper找到的MappingData

2.Pipeline執行

上面說到,Mapper會找到當前請求所屬的host,context和對應的Wrapper,緊接著會進行Pipeline的執行。

為了增強擴展性,tomcat定義了Pipeline(管道)和Valve(閥),Pipeline使用職責鏈的方式串聯多個Valve——來自客戶端的請求如同流水一樣流淌在管道中,受到每一個閥的作用。

Pipeline中維護了基礎的Valve,始終位于Pipeline末端,通過Pipeline#addValve添加的Valve違約基礎的Valve之前。

在Tomcat中Engine,Host,Context,Wrapper都有對應的Valve實現,同時維護了一個Pipeline,從而讓我們可以對請求的處理進行擴展。

下面是比較重要的Valve

StandardEngineValve :Engine對應的Valve,負責請求是否通過mapper找到了對應的Host,并觸發Host對應的Valve

ErrorReportValve: 錯誤報告Valve讓后續的Valve繼續執行,如果執行出現錯誤那么會刷新響應流,讓客戶端收到響應

StandardHostValve:Host對應的Valve,如果請求沒有匹配的context返回404,反之調用Context對應的Valve

StandardContextValve:Context對應的Valve,如果請求路徑以/META-INF/,或者/WEB-INF/開頭,會直接返回404,反之繼續調用Wrapper對應的

StandardWrapperValve:Wrapper對應的Valve,會負責組裝Servlet和Filter,并執行FilterChain#doFilter方法

Filter的匹配主要通過DispatchType和Filter設置的路徑,

在SpringBoot項目中可以使用FilterRegistrationBean#setDispatcherTypes,和addUrlPatterns進行指定。

3.FilterChain執行

在Tomcat中ApplicationFilterChain實現了Java Servlet規范中的FilterChain。

其中使用ApplicationFilterConfig是對FilterConfig的實現,內部持有一個Filter。

ApplicationFilterChain包含多個ApplicationFilterConfig,使用數組和pos屬性記錄當前執行到第幾個Filter

Filter都執行結束后,將執行Servlet#service方法

在SpringMVC項目中,會調用到DispatcherServlet#service,最終調用到Controller。

到此這篇關于Tomcat請求處理流程與源碼淺析的文章就介紹到這了,更多相關Tomcat請求處理內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Tomcat
主站蜘蛛池模板: 网站建设,北京网站建设,北京网站建设公司,网站系统开发,北京网站制作公司,响应式网站,做网站公司,海淀做网站,朝阳做网站,昌平做网站,建站公司 | 烟台条码打印机_烟台条码扫描器_烟台碳带_烟台数据采集终端_烟台斑马打印机-金鹏电子-金鹏电子 | 高光谱相机-近红外高光谱相机厂家-高光谱成像仪-SINESPEC 赛斯拜克 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 除甲醛公司-甲醛检测治理-杭州创绿家环保科技有限公司-室内空气净化十大品牌 | MVR蒸发器厂家-多效蒸发器-工业废水蒸发器厂家-康景辉集团官网 | 暖气片十大品牌厂家_铜铝复合暖气片厂家_暖气片什么牌子好_欣鑫达散热器 | 防腐木批发价格_深圳_惠州_东莞防腐木厂家_森源(深圳)防腐木有限公司 | 丽陂特官网_手机信号屏蔽器_Wifi信号干扰器厂家_学校考场工厂会议室屏蔽仪 | ★济南领跃标识制作公司★济南标识制作,标牌制作,山东标识制作,济南标牌厂 | 高扬程排污泵_隔膜泵_磁力泵_节能自吸离心水泵厂家-【上海博洋】 | 成都茶楼装修公司 - 会所设计/KTV装修 - 成都朗煜装饰公司 | 液氮罐(生物液氮罐)百科-无锡爱思科| 智能监控-安防监控-监控系统安装-弱电工程公司_成都万全电子 | 聚氨酯保温钢管_聚氨酯直埋保温管道_聚氨酯发泡保温管厂家-沧州万荣防腐保温管道有限公司 | 无轨电动平车_轨道平车_蓄电池电动平车★尽在新乡百特智能转运设备有限公司 | 学考网学历中心| 湖南印刷厂|长沙印刷公司|画册印刷|挂历印刷|台历印刷|杂志印刷-乐成印刷 | 河南橡胶接头厂家,河南波纹补偿器厂家,河南可曲挠橡胶软连接,河南套筒补偿器厂家-河南正大阀门 | VOC检测仪-甲醛检测仪-气体报警器-气体检测仪厂家-深恒安科技有限公司 | PVC快速门-硬质快速门-洁净室快速门品牌厂家-苏州西朗门业 | 塑料托盘厂家直销-吹塑托盘生产厂家-力库塑业【官网】 | 产业规划_产业园区规划-产业投资选址及规划招商托管一体化服务商-中机院产业园区规划网 | 高温链条油|高温润滑脂|轴承润滑脂|机器人保养用油|干膜润滑剂-东莞卓越化学 | 布袋除尘器-单机除尘器-脉冲除尘器-泊头市兴天环保设备有限公司 布袋除尘器|除尘器设备|除尘布袋|除尘设备_诺和环保设备 | 氢氧化钙设备, 氢氧化钙生产线-淄博惠琛工贸有限公司 | 桁架楼承板-钢筋桁架楼承板-江苏众力达钢筋楼承板厂 | 上海软件开发-上海软件公司-软件外包-企业软件定制开发公司-咏熠科技 | 大数据营销公司_舆情监测软件_上海SEO公司-文军营销官网 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | 颚式破碎机,圆锥破碎机,制砂机-新乡市德诚机电制造有限公司 | 茅茅虫AI论文写作助手-免费AIGC论文查重_写毕业论文降重 | 伺服电机_直流伺服_交流伺服_DD马达_拓达官方网站 | 专业生物有机肥造粒机,粉状有机肥生产线,槽式翻堆机厂家-郑州华之强重工科技有限公司 | 海南在线 海南一家| 高柔性拖链电缆-聚氨酯卷筒电缆-柔性屏蔽电缆厂家-玖泰电缆 | 骨灰存放架|骨灰盒寄存架|骨灰架厂家|智慧殡葬|公墓陵园管理系统|网上祭奠|告别厅智能化-厦门慈愿科技 | 电磁辐射仪-电磁辐射检测仪-pm2.5检测仪-多功能射线检测仪-上海何亦仪器仪表有限公司 | 沉降天平_沉降粒度仪_液体比重仪-上海方瑞仪器有限公司 | 防伪溯源|防窜货|微信二维码营销|兆信_行业内领先的防伪防窜货数字化营销解决方案供应商 | 锻造液压机,粉末冶金,拉伸,坩埚成型液压机定制生产厂家-山东威力重工官方网站 |