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

时间:2019-05-26 07:24:32

标签: spring spring-boot microservices

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

实际的线程池实现通常在服务器之间可能会有所不同,但是通常,可以对其进行配置(每个循环的线程数,如果池已满,则存储用于将来处理的请求的队列大小,等等)。 )

现在有关RestController的范围。如果控制器是无状态的(并且在许多情况下应该是无状态的,则使其保持单例状态)。如果您需要根据请求创建新的控制器实例,则可以更改范围。显然,每个线程将必须使用相同的Rest Controller实例(在Singleton范围内),否则,如果您指定其他范围,spring mvc将创建一个新的Controller实例。

以上所有答案均适用于“传统”每次请求线程模型。

请注意,自从spring 5 / spring boot 2起,spring还通过webflux支持“ Reactive”模型。它可以在netty之上运行,并且不使用每个请求线程模型。请在问题中指定您是否对此模型感兴趣,而不是我试图简要描述的传统模型。