Spring Boot 是否创建 N 个线程来处理 N 个 API 请求?

Dev*_*yal 4 java spring-boot

我正在使用 Spring Boot 2.5 编写 HTTP API 服务器。我对 Spring Boot 如何处理多个 HTTP 请求有点困惑?

假设 Spring Boot 应用程序一次处理 N 个请求。它是否为 Spring Boot 应用程序创建 N 个线程?

Gio*_*uri 5

\n

Spring Boot是否创建N个线程来处理N个请求?

\n
\n

是的。

\n

然而,(1) 这并不是 Spring Boot 的一个特有功能,(2) 在基于 Web 容器的应用程序中,您真的不应该担心自己管理线程(尽管对内部结构感兴趣是件好事)。

\n

Spring Boot 将其 HTTP 通信基于Servlet API,即 Spring Boot使用Servlet 容器(即在后台作为应用程序服务器运行的容器)来处理 HTTP 通信,并且通常,服务 HTTP Spring Boot 使用 Tomcat,如默认的 Servlet 容器

\n

另一方面,Servlet API 进行了定义HttpServletRequestHttpServletResponse类型化,以便于分别处理 HTTP 请求和 HTTP 响应消息。

\n

现在,问题变成:Servlet Container 如何处理 HTTP 请求

\n

Java\xe2\x84\xa2 Servlet 规范

\n
    \n
  • 2.1 请求处理方法\n
      \n
    • 通常,Web 容器通过在不同线程上并发执行服务方法来处理对同一 servlet 的并发请求;
    • \n
    • (也很重要)处理对 Web 应用程序的并发请求通常要求 Web 开发人员设计能够处理特定时间在服务方法内执行的多个线程的 servlet。
    • \n
    \n
  • \n
\n

另外,请注意service()方法文档的内容:

\n
\n

Servlet 通常在可以同时处理多个请求的多线程 Servlet 容器内运行。开发人员必须注意同步对任何共享资源(例如文件、网络连接以及 servlet 的类和实例变量)的访问。

\n
\n

故事看起来是这样的:

\n
    \n
  1. 当容器看到传入的 HTTP 请求消息被映射到 Servlet 实例时,它会实例化两个对象:HttpServletResponseHttpServletRequest(每个请求都会发生这种情况);

    \n
  2. \n
  3. 然后,容器为该请求创建(或从线程池中分配)一个新线程,并service(..)通过将这些 HttpServletRequest 和 HttpServletResponse 对象传递到该方法中来调用该新线程中的 Servlet 方法。

    \n
  4. \n
\n

如果不是这样设计的,服务器将阻止每个 HTTP 消息的执行,直到后者完成。

\n

请注意:

\n

在两种常见情况下,与请求关联的线程可能处于空闲状态:

\n
    \n
  1. 在构建响应之前,线程需要等待资源变得可用或处理数据。例如,应用程序可能需要在生成响应之前查询数据库或从远程 Web 服务访问数据;
  2. \n
  3. 线程在生成响应之前需要等待事件。例如,在生成响应之前,应用程序可能必须等待 JMS 消息、来自另一个客户端的新信息或队列中可用的新数据。
  4. \n
\n