Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring引导限制控制器中特定API的并发调用次数_Java_Spring Boot - Fatal编程技术网

Java Spring引导限制控制器中特定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

我有一个基于sprint boot(v1.5.15)的Restful应用程序,它提供基于用户的服务,特别是登录和获取用户详细信息

登录活动有点繁重,其中get user details api相当轻量级

我有一个类似的控制器

@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);