java - Spring Boot 是否创建 N 个线程来处理 N 个 API 请求?
问题描述
我正在用 Spring Boot 2.5 编写 HTTP API 服务器。我对 Spring Boot 如何处理多个 HTTP 请求感到有些困惑?
假设 Spring Boot 应用程序一次处理 N 个请求。它是否为 Spring Boot 应用程序创建 N 个线程?
解决方案
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 请求?
Java™ Servlet 规范
- 2.1 请求处理方式
- Web 容器一般通过在不同线程上并发执行 service 方法来处理对同一个 servlet 的并发请求;
- (同样重要)处理对 Web 应用程序的并发请求通常需要 Web Developer 设计 servlet,这些 servlet 可以处理在特定时间在服务方法中执行的多个线程。
另外,请注意service()
方法文档所说的内容:
Servlet 通常在可以同时处理多个请求的多线程 Servlet 容器中运行。开发人员必须注意同步对任何共享资源的访问,例如文件、网络连接以及 servlet 的类和实例变量。
故事是这样的:
当容器看到传入的 HTTP 请求消息被映射到 Servlet 实例时,它会实例化两个对象:
HttpServletResponse
和HttpServletRequest
(每个请求都会发生这种情况);然后,容器为该请求创建(或从线程池分配)一个新线程,并
service(..)
通过将这些 HttpServletRequest 和 HttpServletResponse 对象传递给该方法来调用该新线程中的 Servlet 方法。
如果不是这样设计的,服务器就会阻止每个 HTTP 消息的执行,直到后者完成。
请注意:
与请求关联的线程可能处于空闲状态有两种常见情况:
- 在构建响应之前,线程需要等待资源可用或处理数据。例如,应用程序可能需要在生成响应之前查询数据库或从远程 Web 服务访问数据;
- 线程需要在生成响应之前等待事件。例如,在生成响应之前,应用程序可能必须等待 JMS 消息、来自另一个客户端的新信息或队列中可用的新数据。
推荐阅读
- java - Android WorkManager PeriodicWorkRequest 问题 - 应用程序关闭后未运行
- javascript - 在 graphql-yoga 服务器中使用中间件
- docker - 来自守护进程的错误响应:open \\.\pipe\docker_engine_linux: 系统找不到指定的文件
- reactjs - 反应:OSX 上的格式脚本问题
- python-2.7 - 使用 python 2 在 azure devops workitem 中上传 CSV 文件
- python - 压缩数据
- typescript - 将函数作为参数打字稿传递时避免两次参数定义
- python - 从数据帧为 keras 数据生成一个 numpy-ndarray
- html - 让我的 scrollIntoView 工作(总菜鸟)
- amazon-web-services - 发件人 ID 未显示 AWS SMS