我希望针对我的服务优化和减少REST-API使用滥用。
那么,是否有任何“开箱即用”的方式来限制java spring上对webserivce的并发调用量?
例如,如果我在下面有这个方法
@RequestMapping(value="demo",method=RequestMethod.GET)
public synchronized @ResponseBody ObjectNode getDemo()
{
logger.info("started.. demo ");
ObjectNode node = om.createObjectNode().put("test", true);
logger.info("end.. demo");
return node;
}
我将此服务限制为仅限1位用户。但是,如何将其限制为4或10个并发用户?
谢谢:)
答案 0 :(得分:1)
截至目前,Spring的 没有 开箱即用rate limiting support。
但是,如果您有/可以使用Google Guava,那么RateLimiter
类的形式会提供详细说明here的支持。
如果Google Gauva不是一种选择,请考虑通过Token Bucket算法实施速率限制器。
示例实现应具有以下组件 -
web.xml
中受速率限制的那些网址,并避免/*
模式 )Bucket - 在最简单的形式中,可以将存储桶创建为缓存条目,其中键名称为URL,值为可用令牌,如下例所示
key =' / test / demo'值= 5
key =' / test / otherDemo'值= 10
最好使用AtomicInteger
来保留令牌数以避免任何并发访问问题
过滤器 - 这里只是尝试从存储桶中获取令牌(即读取缓存并查找令牌的正值;对于每个请求,将令牌值减1,直到为零)。 仅在获得令牌时继续请求,否则使用HTTP status code 429
阻止请求 计划程序 - 基于cron的计划服务(请参阅Spring @Scheduled
),以每单位时间允许的最大请求重置缓存。
如果您需要更多信息,请在评论中告诉我。