java - 如何在 Spring Boot 中为每个用户设置速率限制?

标签 java rest spring-mvc spring-boot controller

我正在开发一个 Spring Boot Rest API,它处理大量传入的请求调用。我的 Controller 如下所示:

@RestController

public class ApiController {
    List<ApiObject>  apiDataList;   

    @RequestMapping(value="/data",produces={MediaType.APPLICATION_JSON_VALUE},method=RequestMethod.GET)
    public ResponseEntity<List<ApiObject>> getData(){                                       
        List<ApiObject> apiDataList=getApiData();
        return new ResponseEntity<List<ApiObject>>(apiDataList,HttpStatus.OK);
    }
    @ResponseBody 
    @Async  
    public List<ApiObject>  getApiData(){
        List<ApiObject>  apiDataList3=new List<ApiObject> ();
        //do the processing
        return apiDataList3;
    }
}

所以现在我想为每个用户设置一个速率限制。假设每个用户每分钟只能请求 5 个请求或类似的请求。如何将每个用户的速率限制设置为每分钟仅进行 5 次 api 调用,如果用户请求的次数超过此次数,我可以发回 429 响应?我们需要他们的 IP 地址吗?

任何帮助表示赞赏。

最佳答案

您在 Spring 中没有该组件。

  • 您可以将其构建为解决方案的一部分。创建一个过滤器并在您的 spring 上下文中注册它。过滤器应检查传入调用并计算时间窗口内每个用户的传入请求。我会使用 token bucket algorithm因为它是最灵活的。
  • 您可以构建一些独立于当前解决方案的组件。创建一个 API 网关来完成这项工作。您可以扩展 Zuul 网关,并再次使用 token 桶算法。
  • 您可以使用已经内置的组件,例如 Mulesoft ESB,它可以充当 API 网关并支持速率限制和节流。自己没用过。
  • 最后,您可以使用具有速率限制和节流等功能的 API 管理器。结帐 MuleSoft、WSO2、3Scale、Kong 等...(大多数会产生费用,有些是开源的并且有社区版)。
  • 关于java - 如何在 Spring Boot 中为每个用户设置速率限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44042412/

    相关文章:

    spring - 如何提高 Spring MVC 的性能?

    java - Spring中如何自动将长值转换为字符串?

    java - 避免在 Spring 中为 TImeline 功能创建重复项

    java - Commons配置库添加元素

    c# - C# 和 Java 中的十六进制到字节数组给出不同的结果

    swift - 在 Swift 中使用参数获取

    c# - 我应该在我的 API 上公开接口(interface)而不是具体对象吗?

    javascript - 同步 异步进行 异步调用

    java - Flux的onComplete执行后如何返回Mono?

    java - 从字符串中删除最后一个数字