gpt4 book ai didi

java - 限制 Spring Webservice 并发调用

转载 作者:行者123 更新时间:2023-11-30 06:59:28 24 4
gpt4 key购买 nike

我想优化和减少我的服务的 REST-API 使用滥用。

那么,是否有任何“开箱即用”的方法来限制 java spring 上对 Web 服务的并发调用量?

例如,如果我有下面这个方法

@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 个并发用户怎么样?

谢谢:)

最佳答案

没有开箱即用的 rate limiting support从现在开始, Spring 。

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

如果 Google Gauva 不可行,请考虑通过 Token Bucket 实现速率限制器算法。

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

  • 用于保存 token 的存储桶(最好是内存缓存)
  • 用于拦截请求的 servlet 过滤器(最好仅配置那些在 web.xml 中限制速率的 URL,并避免 /* 模式)
  • 定期补充水桶的预定服务

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

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

最好使用AtomicInteger保存 token 计数以避免任何并发访问问题

过滤器 - 这里简单地尝试从存储桶获取 token (即读取缓存并查找 token 的正值;对于每个请求将 token 值减一直到零)。仅当获取 token 时才继续请求,否则使用 HTTP status code 429 阻止请求

调度程序 - 基于 cron 的调度服务(请参阅 Spring @Scheduled),用于根据每单位时间允许的最大请求来重置缓存。

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

关于java - 限制 Spring Webservice 并发调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41178365/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com