首页 > 解决方案 > Spring Boot 是否创建 N 个线程来处理 N 个 API 请求?

问题描述

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

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

标签: javaspring-boot

解决方案


Spring Boot 会创建 N 个线程来处理 N 个请求吗?

是的。

但是,(1) 这并不是 Spring Boot 的一个特别的特性,并且 (2) 在基于 Web 容器的应用程序中,您真的不应该担心自己管理线程(尽管对内部结构感兴趣,这很好)。

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

另一方面,Servlet API 定义HttpServletRequestHttpServletResponse类型,以便分别使用 HTTP 请求和 HTTP 响应消息。

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

Java™ Servlet 规范

  • 2.1 请求处理方式
    • Web 容器一般通过在不同线程上并发执行 service 方法来处理对同一个 servlet 的并发请求;
    • (同样重要)处理对 Web 应用程序的并发请求通常需要 Web Developer 设计 servlet,这些 servlet 可以处理在特定时间在服务方法中执行的多个线程。

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

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

故事是这样的:

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

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

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

请注意:

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

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

推荐阅读