考虑使用 Spring Boot 2 构建微服务。
答案 0 :(得分:3)
从Spring(应用程序上下文)的角度来看,如果没有另外指定,rest控制器是单例的。
因此控制器的代码必须准备好同时被多个线程调用。
当新请求到达服务器时,在传统的每请求线程模型中,Web服务器(如tomcat)负责将线程从预定义的线程池分配给请求。然后,请求由控制器在此线程的上下文中处理。
实际的线程池实现通常在服务器之间可能会有所不同,但是通常,可以对其进行配置(每个循环的线程数,如果池已满,则存储用于将来处理的请求的队列大小,等等)。 )
现在有关RestController的范围。如果控制器是无状态的(并且在许多情况下应该是无状态的,则使其保持单例状态)。如果您需要根据请求创建新的控制器实例,则可以更改范围。显然,每个线程将必须使用相同的Rest Controller实例(在Singleton范围内),否则,如果您指定其他范围,spring mvc将创建一个新的Controller实例。
以上所有答案均适用于“传统”每次请求线程模型。
请注意,自从spring 5 / spring boot 2起,spring还通过webflux支持“ Reactive”模型。它可以在netty之上运行,并且不使用每个请求线程模型。请在问题中指定您是否对此模型感兴趣,而不是我试图简要描述的传统模型。