当前位置: 首页 > 面试题库 >

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

亢琦
2023-03-14
问题内容

我正在开发一个处理大量传入请求调用的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地址吗?

任何帮助表示赞赏。


问题答案:

Spring中没有该组件。

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


 类似资料:
  • 因此,在回答我的问题(如何连续移动图像平滑Pyplay?)我被告知设置我的帧率,以便做我的动画。但是不管我把它放在哪里,什么都不做。我做BTW。那么我该怎么做呢?我已经研究并发现了这一点(pyplayclock.tick()vs在游戏主循环中的帧率),但我并不真正理解这一点。 我的主要游戏功能; 这是我的主要游戏循环; 主游戏循环不会设置帧速率,因为主游戏函数中有一个循环。这只是一个循环,因为当我

  • > 应用程序A在Q1中发布消息。 应用程序B使用来自Q1的消息,进行一些处理,并在Q2中发布其他消息。B仅在Q2中成功发布消息后才对来自Q1的消息进行ACK。 应用程序C使用来自Q2的消息,进行一些处理,并将一些内容写入数据库。 如果我能限制每个队列的内存和磁盘使用量,而不是限制整个RabbitMQ的内存和磁盘使用量,我想这是可以解决的。有没有办法做到这一点,或者另一种方法来解决我的问题? 如果需

  • 我看的是Incapsula的速率限制,它基于每分钟限制请求等。 有没有一种基于每秒的速率限制方法?因此,如果ip超过每秒1个请求,那么就阻止它。 干杯

  • 全局速率限制架构概述。 { "stage": "...", "disable_key": "...", "actions": [] } stage (optional, integer) 指在过滤器中设置的阶段。速率限制配置仅适用于具有相同阶段编号的过滤器。默认的阶段编号是0。 注意:对于阶段编号,过滤器支持0-10的范围。 disable_key (optional, string

  • 我有一个适用于Android的应用程序,它每N分钟检查一次来自Facebook的新通知,其中N超过5分钟(默认为30分钟)。该应用程序还向Facebook的图形API发出一些用户生成的请求。最近(自从我们为新通知添加计划轮询的那一刻起),Facebook开始限制我们的应用程序(错误#17“已达到用户请求限制”,但有时它会出现错误#4“已达到应用程序请求限制”)。见解仪表板为我们提供了以下统计信息:

  • 我正在使用SpringWebFlux和netty构建一个微服务。在内部,我使用web客户端进行RESTAPI调用。如何控制通过webclient调用RESTAPI的速率?我猜backnpressure只适用于单个请求/回复,不适用于对我的微服务的多个请求。Amy pointers将不胜感激。谢谢

  • 我使用和来实施速率限制,例如每分钟5个请求: 然而,可以在最后一分钟发送5个请求,在第二分钟的第一秒发送5个请求,即在两秒钟内发送10个请求。 如何避免这个问题? 更新:我提出了这个清单。这是一个好方法吗?

  • 我正在使用quarkus.rest客户端调用外部API,并希望将这些调用的频率限制在每秒50次,这样我就不会淹没外部服务。在没有侧车方法的情况下(通过代码),推荐的实现方法是什么?