web-dev-qa-db-fra.com

Comment définir la limite de débit pour chaque utilisateur dans Spring Boot?

Je développe une API Spring Boot Rest qui gère un grand nombre d'appels de demande entrants. Mon contrôleur est quelque chose comme ci-dessous:

@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;
    }
}

Alors maintenant, je voulais définir une limite de rat pour chaque utilisateur. Supposons que chaque utilisateur ne peut demander que 5 demandes par minute ou quelque chose comme ça. Comment définir la limite de débit pour chaque utilisateur pour effectuer seulement 5 appels api par minute et si un utilisateur demande plus que cela, je peux renvoyer une réponse 429? Avons-nous besoin de leur adresse IP?

Toute aide est appréciée.

17
Ricky

Vous n'avez pas ce composant au printemps.

  • Vous pouvez le créer dans le cadre de votre solution. Créez un filtre et enregistrez-le dans votre contexte printanier. Le filtre doit vérifier les appels entrants et compter les demandes entrantes par utilisateur pendant une fenêtre de temps. J'utiliserais algorithme du seau à jetons car c'est le plus flexible.
  • Vous pouvez créer un composant indépendant de votre solution actuelle. Créez une passerelle API qui fait le travail. Vous pouvez étendre la passerelle Zuul et, encore une fois, utiliser l'algorithme du compartiment à jetons.
  • Vous pouvez utiliser un composant déjà intégré, comme Mulesoft ESB, qui peut servir de passerelle API et prend en charge la limitation et la limitation du débit. Je ne l'ai jamais utilisé moi-même.
  • Et enfin, vous pouvez utiliser un gestionnaire d'API qui a une limitation et une limitation du débit et bien plus encore. Commander MuleSoft, WSO2, 3Scale, Kong, etc ... (la plupart auront un coût, certains sont open source et ont une édition communautaire).
12
Daniel Cerecedo

Le printemps n'a pas de limitation de taux hors de la boîte.

Il y a bucket4j-spring-boot-starter projet qui utilise la bibliothèque bucket4j avec l'algorithme token-bucket pour limiter l'accès au REST api. Vous pouvez le configurer via le fichier de propriétés de l'application. Il y a une option pour limiter l'accès en fonction de l'adresse IP ou du nom d'utilisateur .

Comme exemple de configuration simple qui permet un maximum de 5 requêtes en 10 secondes indépendamment de l'utilisateur:

bucket4j:
  enabled: true
  filters:
  - cache-name: buckets
    url: .*
    rate-limits:
    - bandwidths:
      - capacity: 5
    time: 10
    unit: seconds

Si vous utilisez Netflix Zuul vous pouvez utiliser Spring Cloud Zuul RateLimit qui utilise différentes options de stockage: Consul, Redis, Spring Data et Bucket4j.

7
Lukasz R.