Des lecteurs comme vous aident à soutenir MUO. Lorsque vous effectuez un achat en utilisant des liens sur notre site, nous pouvons gagner une commission d'affiliation.

L'un des facteurs que vous voudrez peut-être prendre en compte lors de la création de votre application est la quantité de trafic que vous attendez des utilisateurs. La quantité de trafic détermine peut-être d'autres facteurs qui peuvent inclure l'allocation des ressources, en particulier si vous hébergez votre application sur un fournisseur de services cloud.

La limitation de débit est l'une des techniques que vous pouvez utiliser pour contrôler le trafic sur votre application ou votre réseau.

Qu'est-ce que la limitation de débit ?

La limitation de débit est une technique de restriction d'accès répandue pour limiter le trafic réseau, principalement dans des délais spéculés ou lorsque l'utilisateur a exécuté plusieurs demandes.

La limitation de débit est populaire pour réduire les cyberattaques telles que la force brute et DDoS (déni de service distribué)

instagram viewer
, limitant grattage Web, les demandes d'API et d'autres interactions utilisateur irrégulières telles que l'automatisation des bots et la surcharge du serveur.

Go fournit un support de première classe pour les applications à débit limité dans le taux paquet qui fournit un limiteur de débit et interagit avec le temps emballer.

Le taux package fait partie du projet Go, mais le package n'est pas disponible dans la bibliothèque standard. Vous devrez installer le package avec le obtenir commande.

Exécutez cette commande dans le terminal de votre répertoire de travail pour ajouter le package aux dépendances de votre projet.

aller obtenir "golang.org/x/time/rate"

Importez ces packages dans votre fichier Go pour ce didacticiel.

importer (
"encodage/json"
"golang.org/x/time/rate"
"enregistrer"
"net/http"
)

Le json package sert à encoder une structure en tant que JSON pour le client. Vous utiliserez le enregistrer colis à enregistrer erreurs à la console et le http package pour créer le point de terminaison et le middleware et démarrer un serveur.

Construire une API simple avec un point de terminaison

Classiquement, vous écrivez un middleware pour les fonctions de gestionnaire que vous souhaitez limiter. A chaque fois que l'utilisateur envoie une requête, le middleware valide le statut de la requête avant de relayer l'accès à la fonction de gestionnaire, selon le cas.

Voici le modèle de structure avec des champs de chaîne que vous encoderez pour le client.

taper Message structure {
Réponse chaîne`json:"réponse"`
Description chaîne`json:"description"`
}

La fonction de gestionnaire définira le type de contenu sur JSON, écrira un code d'état de réussite et renverra une instance de structure encodée au client.

fonctionendpointExemple(écrivain http. ResponseWriter, demande *http. Demande) {
écrivain. En-tête().Set("Content-Type", "application/json")
écrivain. Write Header (http. StatutOK)
message := Message{
Réponse: "Succès",
Description: "Vous avez réussi à atteindre le point de terminaison de l'API",
}
erreur := json. NewEncoder (writer).Encode(&message)
si erreur != néant {
retour
}
}

Le endpointExemple la fonction de gestionnaire prend en charge un http emballer écrivain et demande instance de méthode et renvoie un message au client avec le écrivain exemple.

Limitation du débit d'une application Go simple

La limitation du débit via le nombre de requêtes d'un utilisateur ou le nombre de requêtes disponibles est similaire. Vous devrez toujours créer un limiteur avant le processus d'autorisation.

Voici comment créer un limiteur de débit et autoriser les utilisateurs en fonction du nombre de requêtes.

fonctionrateLimiterMiddleware(suivant fonction(écrivain http. ResponseWriter, demande *http. Demande)) http.HandlerFunc {
limiteur := taux. NouveauLimiteur(3, 6) // max de 6 requêtes puis trois autres requêtes par seconde
retour http. FonctionGestionnaire(fonction(écrivain http. ResponseWriter, demande *http. Demande) {
si !limiteur. Permettre() {
écrivain. Écrire([]octet("limite de débit dépassée"))
retour
} autre {
endpointExample (écrivain, requête)
}
})
}

Le rateLimiterMiddleware La fonction de gestionnaire est un middleware qui accepte une fonction de gestionnaire comme argument et renvoie le résultat de l'autorisation après avoir créé un nouveau limiteur de débit avec le NouveauLimiteur méthode qui prend deux paramètres pour le nombre de requêtes par seconde après le nombre maximal de requêtes spécifié.

Le Permettre La méthode de l'instance du limiteur renvoie un booléen en fonction du statut des requêtes autorisées. Le rateLimiterMiddleware renvoie le message JSON si la requête est autorisée ou si le "limite de débit dépassée" message lorsque le client a envoyé le nombre maximum de requêtes.

fonctionprincipal() {
http. HandleFunc("/home", rateLimiterMiddleware (endpointExample))
euh := http. EcouteEtServe(":8080", néant)
si erreur != néant {
enregistrer. Println("Il y a eu une erreur d'écoute sur le port :8080", euh)
}
}

Le principal fonction monte le /home point final à la rateLimiterMiddleware fonction de gestionnaire qui prend en charge endpointExemple fonction de gestionnaire.

Le ÉcouterEtServir la méthode démarre un serveur sur le port localhost 8080 et renvoie les erreurs possibles.

Vous pouvez exécuter cette commande sur le terminal de votre répertoire de travail ou avec un script bash pour tester le point de terminaison après avoir exécuté le serveur.

pour je dans {1..10}; faire boucle http://localhost: 8080/maison; fait

Le code frappe le /home endpoint dix fois avec une requête. Voici le résultat des demandes.

Après la sixième requête (maximum), le client n'est plus autorisé et ne peut plus accéder au point de terminaison.

La limitation du débit est importante

La limitation du débit est essentielle, surtout si vous cherchez à réduire le coût d'hébergement de votre application, à réduire les interférences des bots ou à protéger votre application contre les cyberattaques. Semblable à Go's taux package, npm fournit le express-rate-limit package pour les applications express de limitation de débit.