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

标签 java spring-boot

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

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

最佳答案

Does Spring Boot create N threads to process N requests?

是的。

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

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

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

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

Java™ Servlet Specification

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

另外,请注意 service() 方法 documentation say 是做什么的:

Servlets typically run inside multithreaded servlet containers that can handle multiple requests concurrently. Developers must be aware to synchronize access to any shared resources such as files, network connections, and as well as the servlet's class and instance variables.

故事看起来像这样:

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

  2. 然后容器为该请求创建(或从线程池分配)一个新线程,并通过传递那些 HttpServletRequest 和HttpServletResponse 对象到该方法中。

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

请注意:

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

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

关于java - Spring Boot 是否创建 N 个线程来处理 N 个 API 请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66542322/

相关文章:

java - jar 文件到 web 服务

java - 如何解析通用 XSD 文档

java - 用于对具有相同标签的指标进行分组的自定义名称

java - Spring Boot Weblogic 12c JNDI 数据源 : injection not working gives NullPointerException

java - Spring Boot - 使用应用程序监听器

java - 扫描不适用于 logback.xml

java - 当文件大小 > 1GB 时,Gson.toJson 抛出 NullPointerException

java - UnsatisfiedLinkError "Access is denied"即使完全控制

java - 启动@Async : what is best way to create 1000 no of threads using spring

java - 无法打开输出流