限制Spring Webservice并发调用

时间:2016-12-16 06:19:28

标签: java spring web-services concurrency

我希望针对我的服务优化和减少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个并发用户?

谢谢:)

1 个答案:

答案 0 :(得分:1)

截至目前,Spring的 没有 开箱即用rate limiting support

但是,如果您有/可以使用Google Guava,那么RateLimiter类的形式会提供详细说明here的支持。

如果Google Gauva不是一种选择,请考虑通过Token Bucket算法实施速率限制器。

示例实现应具有以下组件 -

  • 用于保存令牌的存储桶最好是内存缓存
  • 用于拦截请求的 servlet过滤器最好只配置web.xml中受速率限制的那些网址,并避免/*模式
  • 计划服务定期补充广告资源

Bucket - 在最简单的形式中,可以将存储桶创建为缓存条目,其中键名称为URL,值为可用令牌,如下例所示

  

key =' / test / demo'值= 5   
key =' / test / otherDemo'值= 10

最好使用AtomicInteger来保留令牌数以避免任何并发访问问题

过滤器 - 这里只是尝试从存储桶中获取令牌(即读取缓存并查找令牌的正值;对于每个请求,将令牌值减1,直到为零)。 仅在获得令牌时继续请求,否则使用HTTP status code 429

阻止请求

计划程序 - 基于cron的计划服务(请参阅Spring @Scheduled ),以每单位时间允许的最大请求重置缓存。

如果您需要更多信息,请在评论中告诉我。