【发布时间】:2021-06-07 01:44:10
【问题描述】:
我正在使用 Spring Boot 2.5 编写 HTTP API 服务器。我对 Spring Boot 如何处理多个 HTTP 请求感到有些困惑?
假设 Spring Boot 应用程序一次处理 N 个请求。它是否为 Spring Boot 应用程序创建 N 个线程?
【问题讨论】:
标签: java spring-boot
我正在使用 Spring Boot 2.5 编写 HTTP API 服务器。我对 Spring Boot 如何处理多个 HTTP 请求感到有些困惑?
假设 Spring Boot 应用程序一次处理 N 个请求。它是否为 Spring Boot 应用程序创建 N 个线程?
【问题讨论】:
标签: java spring-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 定义了 HttpServletRequest 和 HttpServletResponse 类型,以便分别处理 HTTP 请求和 HTTP 响应消息。
现在,问题变成了:Servlet Container 如何处理 HTTP 请求?
另外,请注意service() 方法documentation say 的作用:
Servlet 通常在可以同时处理多个请求的多线程 Servlet 容器中运行。开发人员必须注意同步对任何共享资源的访问,例如文件、网络连接以及 servlet 的类和实例变量。
当容器看到传入的 HTTP 请求消息被映射到 Servlet 实例时,它会实例化两个对象:HttpServletResponse 和 HttpServletRequest(每个请求都会发生这种情况);
容器然后为该请求创建(或从线程池分配)一个新线程,并通过将这些 HttpServletRequest 和 HttpServletResponse 对象传递给该方法,在该新线程中调用 Servlet 的 service(..) 方法。
如果不是这样设计的,服务器会阻止每个 HTTP 消息的执行,直到后者完成。
请注意:
与请求关联的线程可能处于空闲状态的常见情况有两种:
【讨论】: