Java Spring引导限制控制器中特定API的并发调用次数
我有一个基于sprint boot(v1.5.15)的Restful应用程序,它提供基于用户的服务,特别是登录和获取用户详细信息 登录活动有点繁重,其中get user details api相当轻量级 我有一个类似的控制器Java Spring引导限制控制器中特定API的并发调用次数,java,spring-boot,Java,Spring Boot,我有一个基于sprint boot(v1.5.15)的Restful应用程序,它提供基于用户的服务,特别是登录和获取用户详细信息 登录活动有点繁重,其中get user details api相当轻量级 我有一个类似的控制器 @RestController public class UserController{ @PostMapping("/login") public LoginResponse userLogin(@RequestBody LoginRequest log
@RestController
public class UserController{
@PostMapping("/login")
public LoginResponse userLogin(@RequestBody LoginRequest loginRequest){
...
}
@GetMapping("/users/{id}")
public LoginResponse userIdGet(@PathVariable("id") String id){
...
}
}
有没有办法限制对/login
api的并发调用数。基本上,我想把这个限制为x,因为/users/{id}
可以在相同的资源中处理大约10倍的调用
应用程序使用嵌入式tomcat服务器,我知道
server.tomcat.max connections
,server.tomcat.max threads
和server.tomcat.min spare threads
,但是这些限制了在应用程序级别而不是在API上的调用。有一些解决方案限制了活动连接的数量,见例
然而,恕我直言,这样的解决方案只是拒绝了进一步的要求
如果您不想拒绝请求,您可以通过使用应用程序范围的固定线程池ExecutorService()来限制并发工作,并将请求主体提交到该线程池,并在返回的将来立即调用get
所以你可以替换
@PostMapping("/api/xyzMethod")
public Response xyzMethod(@RequestBody Request request) {
return handleXyzMethod(request); });
}
借
有一些
private static ExecutorService xyzMethodExecutor = Executors.newFixedThreadPool(10);
一个缺点是,用户可能必须等待回复和/或多个请求将填充线程池队列,直到服务变得(太)无响应。因此,您可能必须为该解决方案在未来任务上赋予某种超时,或者将这两种解决方案结合起来(这也就是说,对并发会话的数量有更大的限制).可能通过节流:您可以使用Spring AOP截获登录调用和自定义计数器,并在
counter>MaxAllowed
@EugenCovaci时返回HTTP错误代码-这是一种检查框外是否有任何东西对我有帮助的方法。@petermm-Thnx将对此进行检查。
private static ExecutorService xyzMethodExecutor = Executors.newFixedThreadPool(10);