成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Boot是如何處理HTTP請求的?

開發
本文介紹了在Spring Boot應用程序中處理HTTP請求的內部工作原理。

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

探索設置

首先,來看一個示例控制器類:

@RestController
class GreetingController {

    @GetMapping("/greeting")
    fun getGreeting() = "hi there"

}

在這個例子中,有一個單一的端點,返回一個基本的字符串響應。要設置您的項目,請將以下依賴項添加到build.gradle文件中:

implementation("org.springframework.boot:spring-boot-starter-web")

現在,使用Apache Tomcat運行應用程序。

./gradlew bootRun

Apache Tomcat

Spring Boot為我們啟動了一個嵌入式Tomcat Web服務器,默認情況下監聽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容器,實現了關鍵的Java企業(現在是Jakarta EE)標準,包括Jakarta Servlet、Jakarta Server Pages和Jakarta WebSocket。

在Spring中,它啟動了一個Servlet容器,該容器監聽默認的TCP端口8080,用于接收請求。一旦有請求到達,我們可以觀察到接收者和工作線程開始處理請求:

接受者線程負責接收傳入請求并將其放入隊列中。但是,如果隊列達到其容量,則接受者將拒絕其他請求。另一方面,工作線程從接受者隊列中檢索請求,并在其專用線程堆棧中處理每個請求。

我們目前有1個接受者和10個工作線程。但是,請注意這些值可能會因我們的特定配置而有所不同。由于我們沒有修改任何配置參數,因此Spring已根據Spring Boot文檔中概述的默認值自動為我們設置了默認值。

需要考慮的一些重要配置參數是:

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)線程。這意味著單個線程可以管理多個連接并維護它們的持續時間,該持續時間由keepAlive參數確定。

要查看請求處理過程,請向我們的端點發送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包中輕松找到此類。在此包中,您將發現DispatcherServlet實際上是擴展HttpServlet類的標準servlet。它作為所有Spring基礎架構的入口點,在由Web服務器管理的Web應用程序中使用。

在Spring Web應用程序中,在配置中定義DispatcherServlet時,Apache Tomcat容器將初始化此servlet并將我們的請求委托給它,利用其工作線程之一。

請求映射

DispatcherServlet中的中心方法是doService方法,它接收并指導我們的請求。

您可能會想知道,它如何確定適當的類來處理此特定請求。

答案在于它的handlerMappings字段,該字段存儲實現HandlerMapping接口的類集合。在DispatcherServlet實例化期間,此字段由initHandlerMappingsmethod初始化。

每當我們使用方法級別的@RequestMapping注釋定義新的@Controller類時,Spring都會自動生成一個RequestMappingInfo類。然后,將此生成的信息無縫地合并到handlerMappings屬性中。隨后,我們的DispatcherServlet利用此數據進行精確的請求路由。

讓我們在調試模式下更仔細地查看這個列表,您確實會找到我們的映射:

其余邏輯非常簡單。利用getHandler方法,DispatcherServlet在循環中迭代所有映射:

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仍然將請求傳遞給找到的處理程序。這就是它的工作原理。

總結

本文介紹了在Spring Boot應用程序中處理HTTP請求的內部工作原理。了解了Spring Boot如何初始化Tomcat servlet容器、管理工作線程以及使用DispatcherServlet將請求路由到適當的控制器方法。

責任編輯:趙寧寧 來源: Java學研大本營
相關推薦

2021-01-18 05:13:04

TomcatHttp

2023-10-04 07:35:03

2023-03-06 08:37:58

JavaNIO

2021-03-24 10:40:26

Python垃圾語言

2025-01-09 10:20:53

2021-07-27 14:50:15

axiosHTTP前端

2014-11-10 10:52:33

Go語言

2021-05-31 10:47:17

SpringSecuritySession

2011-09-02 11:06:28

Oracle服務器進程為事務建立回滾段放入dirty lis

2021-01-25 06:53:59

前端AJAX技術熱點

2024-12-25 10:24:31

2024-05-31 14:04:18

2025-02-12 08:07:40

2024-10-16 08:51:57

2019-04-15 08:32:25

Spring Boot日志門面模式

2015-08-31 10:14:30

程序員處理代碼糟糕代碼

2015-09-01 11:20:58

程序員糟糕代碼

2022-06-02 10:38:42

微服務數據源分布式

2024-12-19 08:00:00

2024-09-30 08:43:33

HttpgolangTimeout
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 神马久久春色视频 | 免费特级黄毛片 | 国产羞羞视频在线观看 | 天天综合国产 | 黄色av网站在线观看 | www.日本三级 | 精品视频一区二区三区在线观看 | 精品人伦一区二区三区蜜桃网站 | 欧美日本在线观看 | 亚洲 欧美 另类 综合 偷拍 | 国产在线中文字幕 | 伊人久久麻豆 | 久久av网站 | 久久大陆 | 国产乱码精品一区二区三区中文 | 91国内在线观看 | 99热最新网址| 午夜影院在线观看 | 国产亚洲精品成人av久久ww | 国产精品久久久久久久久久免费看 | 性高湖久久久久久久久3小时 | 精品日本久久久久久久久久 | 波多野结衣在线观看一区二区三区 | 日韩欧美第一页 | 日本一道本| 日本小视频网站 | www.99re| 午夜电影网站 | 日本一级淫片免费啪啪3 | 久久久久久国产精品 | 综合久久av | 人碰人操| 久久久精品综合 | 国产午夜视频 | 91精品国产91久久久久游泳池 | 99re在线观看 | 久久99精品久久久久蜜桃tv | 久久伊人免费视频 | 免费看黄视频网站 | 国产精品一区二区不卡 | 午夜影院黄 |