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.
Vous n'avez pas ce composant au printemps.
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.