一尘不染

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

spring-boot

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

@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地址吗?

任何帮助表示赞赏。


阅读 674

收藏
2020-05-30

共1个答案

一尘不染

Spring中没有该组件。

  • 您可以将其构建为解决方案的一部分。创建一个过滤器并在您的spring上下文中注册它。过滤器应检查传入呼叫,并在一个时间窗口内计算每个用户的传入请求。我会使用令牌桶算法,因为它是最灵活的。
  • 您可以构建一些独立于当前解决方案的组件。创建完成该任务的API网关。您可以扩展Zuul网关,然后再次使用令牌桶算法。
  • 您可以使用已经内置的组件,例如Mulesoft ESB,它可以充当API网关并支持速率限制和限制。我自己从未使用过。
  • 最后,您可以使用具有速率限制和限制等功能的API Manager。Checkout MuleSoft,WSO2、3Scale,Kong等…(大多数将需要付费,一些是开源的,并且具有社区版)。
2020-05-30