Rest Controller 如何同时处理单实例应用程序的多个请求?

Ana*_*mar 5 spring spring-boot microservices

  1. 如果应用程序中同时向单个 RestController 发出多个请求,则如何处理不同场景(对单个端点的多个请求(仅 GET),或对多个端点的多个请求(GET、POST、PUT..)) .))
  2. 是否利用了多线程概念?如果是,是否可以以 FIFO 模式处理请求?
  3. RestController 可以接受的最大请求是多少?
  4. RestController 范围是否会影响请求的处理(默认范围单例的请求范围的行为)?
  5. 还有应用程序上下文如何处理它(带有流程的示例会很有帮助)

考虑使用Spring Boot 2构建微服务

Mar*_*nik 6

从Spring(应用程序上下文)的角度来看,如果没有另外指定,其余控制器是一个单例。

因此控制器的代码必须准备好被多个线程同时调用。

当新请求到达服务器时,在传统的每个请求线程模型中,Web 服务器(如 tomcat)负责从预定义的线程池中为该请求分配一个线程。然后控制器在此线程的上下文中处理该请求。

实际的线程池实现通常因服务器而异,但一般来说,它是可以配置的(每个循环的线程数、在池已满时存储请求以供将来处理的队列大小等)

现在讨论 RestController 的范围。如果控制器是无状态的(在很多情况下应该是这样,只需保持其单例)。如果您需要为每个请求创建新的控制器实例,请更改范围。显然,每个线程都必须使用相同的(在单例范围的情况下)剩余控制器实例,或者如果您指定另一个范围,则 spring mvc 将创建一个新的控制器实例。

上面的所有答案都适用于“传统”每个请求线程模型。

请注意,从 spring 5 / spring boot 2 开始,spring 还支持带有 webflux 的“反应式”模型。它在 netty 之上工作,不使用每个请求线程模型。请在问题中注明您是否对此模型而不是我试图简要描述的传统模型感兴趣。