新聞中心
在Spring Boot中創(chuàng)建基本的REST控制器是個簡單的過程。通過使用一些注釋,您可以封裝所需的邏輯,讓Spring Boot處理其余部分。但是,這背后究竟發(fā)生了什么?本文將詳細介紹Spring Boot如何處理HTTP請求的復(fù)雜性。

創(chuàng)新互聯(lián)是專業(yè)的甘南網(wǎng)站建設(shè)公司,甘南接單;提供成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行甘南網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
探索設(shè)置
首先,來看一個示例控制器類:
@RestController
class GreetingController {
@GetMapping("/greeting")
fun getGreeting() = "hi there"
}在這個例子中,有一個單一的端點,返回一個基本的字符串響應(yīng)。要設(shè)置您的項目,請將以下依賴項添加到build.gradle文件中:
implementation("org.springframework.boot:spring-boot-starter-web")現(xiàn)在,使用Apache Tomcat運行應(yīng)用程序。
./gradlew bootRunApache Tomcat
Spring Boot為我們啟動了一個嵌入式Tomcat Web服務(wù)器,默認情況下監(jiān)聽8080端口:
2023-09-10T19:07:52.604 INFO 8712 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''Apache Tomcat是一個開源Java Servlet容器,實現(xiàn)了關(guān)鍵的Java企業(yè)(現(xiàn)在是Jakarta EE)標準,包括Jakarta Servlet、Jakarta Server Pages和Jakarta WebSocket。
在Spring中,它啟動了一個Servlet容器,該容器監(jiān)聽默認的TCP端口8080,用于接收請求。一旦有請求到達,我們可以觀察到接收者和工作線程開始處理請求:
接受者線程負責(zé)接收傳入請求并將其放入隊列中。但是,如果隊列達到其容量,則接受者將拒絕其他請求。另一方面,工作線程從接受者隊列中檢索請求,并在其專用線程堆棧中處理每個請求。
我們目前有1個接受者和10個工作線程。但是,請注意這些值可能會因我們的特定配置而有所不同。由于我們沒有修改任何配置參數(shù),因此Spring已根據(jù)Spring Boot文檔中概述的默認值自動為我們設(shè)置了默認值。
需要考慮的一些重要配置參數(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)線程。這意味著單個線程可以管理多個連接并維護它們的持續(xù)時間,該持續(xù)時間由keepAlive參數(shù)確定。
要查看請求處理過程,請向我們的端點發(fā)送HTTP請求:
curl localhost:8080/greeting您將觀察到其中一個工作線程處理請求:
Dispatcher servlet
接下來介紹如何將請求路由到我們的控制器邏輯。
在請求之后,您會注意到一個日志條目:
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這表明已實例化DispatcherServlet類的一個實例來處理請求。 您可以在org.springframework.web.servlet包中輕松找到此類。在此包中,您將發(fā)現(xiàn)DispatcherServlet實際上是擴展HttpServlet類的標準servlet。它作為所有Spring基礎(chǔ)架構(gòu)的入口點,在由Web服務(wù)器管理的Web應(yīng)用程序中使用。
在Spring Web應(yīng)用程序中,在配置中定義DispatcherServlet時,Apache Tomcat容器將初始化此servlet并將我們的請求委托給它,利用其工作線程之一。
請求映射
DispatcherServlet中的中心方法是doService方法,它接收并指導(dǎo)我們的請求。
您可能會想知道,它如何確定適當?shù)念悂硖幚泶颂囟ㄕ埱蟆?/p>
答案在于它的handlerMappings字段,該字段存儲實現(xiàn)HandlerMapping接口的類集合。在DispatcherServlet實例化期間,此字段由initHandlerMappingsmethod初始化。
每當我們使用方法級別的@RequestMapping注釋定義新的@Controller類時,Spring都會自動生成一個RequestMappingInfo類。然后,將此生成的信息無縫地合并到handlerMappings屬性中。隨后,我們的DispatcherServlet利用此數(shù)據(jù)進行精確的請求路由。
讓我們在調(diào)試模式下更仔細地查看這個列表,您確實會找到我們的映射:
其余邏輯非常簡單。利用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仍然將請求傳遞給找到的處理程序。這就是它的工作原理。
總結(jié)
本文介紹了在Spring Boot應(yīng)用程序中處理HTTP請求的內(nèi)部工作原理。了解了Spring Boot如何初始化Tomcat servlet容器、管理工作線程以及使用DispatcherServlet將請求路由到適當?shù)目刂破鞣椒ā?/p>
新聞標題:SpringBoot是如何處理HTTP請求的?
網(wǎng)頁網(wǎng)址:http://www.dlmjj.cn/article/dpcpdho.html


咨詢
建站咨詢
