在Spring Boot中創(chuàng)建基本的REST控制器是個(gè)簡(jiǎn)單的過程。通過使用一些注釋,您可以封裝所需的邏輯,讓Spring Boot處理其余部分。但是,這背后究竟發(fā)生了什么?本文將詳細(xì)介紹Spring Boot如何處理HTTP請(qǐng)求的復(fù)雜性。
接受者線程負(fù)責(zé)接收傳入請(qǐng)求并將其放入隊(duì)列中。但是,如果隊(duì)列達(dá)到其容量,則接受者將拒絕其他請(qǐng)求。另一方面,工作線程從接受者隊(duì)列中檢索請(qǐng)求,并在其專用線程堆棧中處理每個(gè)請(qǐng)求。
我們目前有1個(gè)接受者和10個(gè)工作線程。但是,請(qǐng)注意這些值可能會(huì)因我們的特定配置而有所不同。由于我們沒有修改任何配置參數(shù),因此Spring已根據(jù)Spring Boot文檔中概述的默認(rèn)值自動(dòng)為我們?cè)O(shè)置了默認(rèn)值。
需要考慮的一些重要配置參數(shù)是:
server.tomcat.accept-count=100 # Maximum queue length for incoming connection requests when all possible request processing threads are in use.server.tomcat.max-connections=10000 # Maximum number of connections that the server accepts and processes at any given time.server.tomcat.max-threads=200 # Maximum amount of worker threads.server.tomcat.min-spare-threads=10 # Minimum amount of worker threads.
此外,值得注意的是,我們使用非阻塞IO(NIO)線程。這意味著單個(gè)線程可以管理多個(gè)連接并維護(hù)它們的持續(xù)時(shí)間,該持續(xù)時(shí)間由keepAlive參數(shù)確定。
要查看請(qǐng)求處理過程,請(qǐng)向我們的端點(diǎn)發(fā)送HTTP請(qǐng)求:
curl localhost:8080/greeting
您將觀察到其中一個(gè)工作線程處理請(qǐng)求:
接下來介紹如何將請(qǐng)求路由到我們的控制器邏輯。
在請(qǐng)求之后,您會(huì)注意到一個(gè)日志條目:
2023-09-10T19:07:58.604 INFO 23948 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'2023-09-10T19:07:58.292 INFO 23948 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'2023-09-10T19:07:58.293 INFO 23948 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
這表明已實(shí)例化DispatcherServlet類的一個(gè)實(shí)例來處理請(qǐng)求。 您可以在org.springframework.web.servlet包中輕松找到此類。在此包中,您將發(fā)現(xiàn)DispatcherServlet實(shí)際上是擴(kuò)展HttpServlet類的標(biāo)準(zhǔn)servlet。它作為所有Spring基礎(chǔ)架構(gòu)的入口點(diǎn),在由Web服務(wù)器管理的Web應(yīng)用程序中使用。
在Spring Web應(yīng)用程序中,在配置中定義DispatcherServlet時(shí),Apache Tomcat容器將初始化此servlet并將我們的請(qǐng)求委托給它,利用其工作線程之一。
DispatcherServlet中的中心方法是doService方法,它接收并指導(dǎo)我們的請(qǐng)求。
您可能會(huì)想知道,它如何確定適當(dāng)?shù)念悂硖幚泶颂囟ㄕ?qǐng)求。
答案在于它的handlerMappings字段,該字段存儲(chǔ)實(shí)現(xiàn)HandlerMapping接口的類集合。在DispatcherServlet實(shí)例化期間,此字段由initHandlerMappingsmethod初始化。
每當(dāng)我們使用方法級(jí)別的@RequestMapping注釋定義新的@Controller類時(shí),Spring都會(huì)自動(dòng)生成一個(gè)RequestMappingInfo類。然后,將此生成的信息無縫地合并到handlerMappings屬性中。隨后,我們的DispatcherServlet利用此數(shù)據(jù)進(jìn)行精確的請(qǐng)求路由。
讓我們?cè)谡{(diào)試模式下更仔細(xì)地查看這個(gè)列表,您確實(shí)會(huì)找到我們的映射:
其余邏輯非常簡(jiǎn)單。利用getHandler方法,DispatcherServlet在循環(huán)中迭代所有映射:
2023-09-10T19:07:58.604 INFO 23948 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'2023-09-10T19:07:58.292 INFO 23948 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'2023-09-10T19:07:58.293 INFO 23948 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
一旦它確定了合適的處理程序,您可以在調(diào)試模式下觀察處理程序類:
DispatcherServlet仍然將請(qǐng)求傳遞給找到的處理程序。這就是它的工作原理。
本文介紹了在Spring Boot應(yīng)用程序中處理HTTP請(qǐng)求的內(nèi)部工作原理。了解了Spring Boot如何初始化Tomcat servlet容器、管理工作線程以及使用DispatcherServlet將請(qǐng)求路由到適當(dāng)?shù)目刂破鞣椒ā?span style="display:none">W1n28資訊網(wǎng)——每日最新資訊28at.com
本文鏈接:http://www.www897cc.com/showinfo-26-10582-0.htmlSpring Boot是如何處理HTTP請(qǐng)求的?
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 七種實(shí)現(xiàn)Web實(shí)時(shí)消息推送的方案
下一篇: 深入理解Java內(nèi)存工作原理