当前位置:首页 > 科技  > 软件

Spring Boot是如何处理HTTP请求的?

来源: 责编: 时间:2023-09-20 21:55:25 204观看
导读在Spring Boot中创建基本的REST控制器是个简单的过程。通过使用一些注释,您可以封装所需的逻辑,让Spring Boot处理其余部分。但是,这背后究竟发生了什么?本文将详细介绍Spring Boot如何处理HTTP请求的复杂性。探索设置首

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

F5s28资讯网——每日最新资讯28at.com

探索设置

首先,来看一个示例控制器类:F5s28资讯网——每日最新资讯28at.com

@RestControllerclass GreetingController {    @GetMapping("/greeting")    fun getGreeting() = "hi there"}

在这个例子中,有一个单一的端点,返回一个基本的字符串响应。要设置您的项目,请将以下依赖项添加到build.gradle文件中:F5s28资讯网——每日最新资讯28at.com

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

现在,使用Apache Tomcat运行应用程序。F5s28资讯网——每日最新资讯28at.com

./gradlew bootRun

Apache Tomcat

Spring Boot为我们启动了一个嵌入式Tomcat Web服务器,默认情况下监听8080端口:F5s28资讯网——每日最新资讯28at.com

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。F5s28资讯网——每日最新资讯28at.com

在Spring中,它启动了一个Servlet容器,该容器监听默认的TCP端口8080,用于接收请求。一旦有请求到达,我们可以观察到接收者和工作线程开始处理请求:F5s28资讯网——每日最新资讯28at.com

F5s28资讯网——每日最新资讯28at.com

接受者线程负责接收传入请求并将其放入队列中。但是,如果队列达到其容量,则接受者将拒绝其他请求。另一方面,工作线程从接受者队列中检索请求,并在其专用线程堆栈中处理每个请求。F5s28资讯网——每日最新资讯28at.com

我们目前有1个接受者和10个工作线程。但是,请注意这些值可能会因我们的特定配置而有所不同。由于我们没有修改任何配置参数,因此Spring已根据Spring Boot文档中概述的默认值自动为我们设置了默认值。F5s28资讯网——每日最新资讯28at.com

需要考虑的一些重要配置参数是:F5s28资讯网——每日最新资讯28at.com

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参数确定。F5s28资讯网——每日最新资讯28at.com

要查看请求处理过程,请向我们的端点发送HTTP请求:F5s28资讯网——每日最新资讯28at.com

curl localhost:8080/greeting

您将观察到其中一个工作线程处理请求:F5s28资讯网——每日最新资讯28at.com

F5s28资讯网——每日最新资讯28at.com

Dispatcher servlet

接下来介绍如何将请求路由到我们的控制器逻辑。F5s28资讯网——每日最新资讯28at.com

在请求之后,您会注意到一个日志条目:F5s28资讯网——每日最新资讯28at.com

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应用程序中使用。F5s28资讯网——每日最新资讯28at.com

在Spring Web应用程序中,在配置中定义DispatcherServlet时,Apache Tomcat容器将初始化此servlet并将我们的请求委托给它,利用其工作线程之一。F5s28资讯网——每日最新资讯28at.com

请求映射

DispatcherServlet中的中心方法是doService方法,它接收并指导我们的请求。F5s28资讯网——每日最新资讯28at.com

您可能会想知道,它如何确定适当的类来处理此特定请求。F5s28资讯网——每日最新资讯28at.com

答案在于它的handlerMappings字段,该字段存储实现HandlerMapping接口的类集合。在DispatcherServlet实例化期间,此字段由initHandlerMappingsmethod初始化。F5s28资讯网——每日最新资讯28at.com

每当我们使用方法级别的@RequestMapping注释定义新的@Controller类时,Spring都会自动生成一个RequestMappingInfo类。然后,将此生成的信息无缝地合并到handlerMappings属性中。随后,我们的DispatcherServlet利用此数据进行精确的请求路由。F5s28资讯网——每日最新资讯28at.com

让我们在调试模式下更仔细地查看这个列表,您确实会找到我们的映射:F5s28资讯网——每日最新资讯28at.com

F5s28资讯网——每日最新资讯28at.com

其余逻辑非常简单。利用getHandler方法,DispatcherServlet在循环中迭代所有映射:F5s28资讯网——每日最新资讯28at.com

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

一旦它确定了合适的处理程序,您可以在调试模式下观察处理程序类:F5s28资讯网——每日最新资讯28at.com

F5s28资讯网——每日最新资讯28at.com

DispatcherServlet仍然将请求传递给找到的处理程序。这就是它的工作原理。F5s28资讯网——每日最新资讯28at.com

总结

本文介绍了在Spring Boot应用程序中处理HTTP请求的内部工作原理。了解了Spring Boot如何初始化Tomcat servlet容器、管理工作线程以及使用DispatcherServlet将请求路由到适当的控制器方法。F5s28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-10582-0.htmlSpring Boot是如何处理HTTP请求的?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 七种实现Web实时消息推送的方案

下一篇: 深入理解Java内存工作原理

标签:
  • 热门焦点
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • Raft算法:保障分布式系统共识的稳健之道

    Raft算法:保障分布式系统共识的稳健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • 十个可以手动编写的 JavaScript 数组 API

    十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 三万字盘点 Spring 九大核心基础功能

    三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • 使用LLM插件从命令行访问Llama 2

    使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 一文搞定Java NIO,以及各种奇葩流

    一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • 引领旗舰级影像能力向中端机普及 OPPO K11 系列发布 1799 元起

    引领旗舰级影像能力向中端机普及 OPPO K11 系列发布 1799 元起

    7月25日,OPPO正式发布K系列新品—— OPPO K11 。此次 K11 在中端手机市场长期被忽视的影像板块发力,突破性地搭载索尼 IMX890 旗舰大底主摄,支持 OIS
  • 亲历马斯克血洗Twitter,硅谷的苦日子在后头

    亲历马斯克血洗Twitter,硅谷的苦日子在后头

    文/刘哲铭  编辑/李薇  马斯克再次挥下裁员大刀。  美国时间11月14日,Twitter约4400名外包员工遭解雇,此次被解雇的员工的主要工作为内容审核等。此前,T
Top