SpringBoot是如何处理HTTP请求的?

在Spring Boot中创建基本的REST控制器是个简单的过程。通过使用一些注释,您可以封装所需的逻辑,让Spring Boot处理其余部分。但是,这背后究竟发生了什么?本文将详细介绍Spring Boot如何处理HTTP请求的复杂性。

创新互联是专业的甘南网站建设公司,甘南接单;提供成都网站设计、网站建设、外贸网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行甘南网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

探索设置

首先,来看一个示例控制器类:

@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将请求路由到适当的控制器方法。

分享文章:SpringBoot是如何处理HTTP请求的?
分享地址:http://www.shufengxianlan.com/qtweb/news33/504133.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联