Lezers zoals jij steunen MUO. Wanneer u een aankoop doet via links op onze site, kunnen we een aangesloten commissie verdienen.

Een van de factoren waarmee u mogelijk rekening wilt houden bij het bouwen van uw applicatie, is de hoeveelheid verkeer die u van gebruikers verwacht. De hoeveelheid verkeer bepaalt mogelijk meer factoren, waaronder de toewijzing van bronnen, vooral als u uw app host bij een cloudserviceprovider.

Snelheidsbeperking is een van de technieken die u kunt gebruiken om verkeer op uw applicatie of netwerk te controleren.

Wat is snelheidsbegrenzing?

Snelheidsbeperking is een wijdverspreide toegangsbeperkingstechniek om netwerkverkeer te beperken, voornamelijk binnen gespecificeerde tijdsbestekken of wanneer de gebruiker meerdere verzoeken heeft uitgevoerd.

Snelheidsbeperking is populair voor het verminderen van cyberaanvallen zoals brute kracht en DDoS (gedistribueerde denial of service), beperken web schrapen, API-verzoeken en andere onregelmatige gebruikersinteracties zoals botautomatisering en serverbelasting.

instagram viewer

Go biedt eersteklas ondersteuning voor snelheidsbeperkende toepassingen in de tarief pakket dat een snelheidsbegrenzer biedt en samenwerkt met de tijd pakket.

De tarief pakket maakt deel uit van het Go-project, maar het pakket is niet beschikbaar in de standaardbibliotheek. U moet het pakket installeren met de krijgen commando.

Voer deze opdracht uit in de terminal van uw werkmap om het pakket toe te voegen aan de afhankelijkheden van uw project.

gaan krijg "golang.org/x/time/rate"

Importeer deze pakketten in uw Go-bestand voor deze zelfstudie.

importeren (
"codering/json"
"golang.org/x/time/rate"
"logboek"
"net/http"
)

De json pakket is voor het coderen van een struct als JSON naar de client. Je gebruikt de loggen pakket naar loggen fouten naar de console en de http pakket om het eindpunt en de middleware te bouwen en een server te starten.

Een eenvoudige API bouwen met één eindpunt

Gewoonlijk schrijft u een middleware voor de handlerfuncties die u wilt beperken. Elke keer dat de gebruiker een verzoek verzendt, valideert de middleware de verzoekstatus voordat de toegang tot de handlerfunctie wordt doorgestuurd, afhankelijk van het geval.

Dit is het struct-model met stringvelden die u naar de client codeert.

type Bericht structuur {
Antwoord snaar`json:"antwoord"`
Beschrijving snaar`json:"beschrijving"`
}

De handlerfunctie stelt het inhoudstype in op JSON, schrijft een succesvolle statuscode en retourneert een gecodeerde structuurinstantie naar de client.

funceindpuntVoorbeeld(schrijver http. ResponseWriter, vraag *http. Verzoek) {
auteur. Header().Set("Content-Type", "application/json")
auteur. Schrijfkop (http. StatusOK)
bericht := Bericht{
Reactie: "Geslaagd",
Beschrijving: "U heeft met succes het API-eindpunt bereikt",
}
fout := json. NewEncoder (schrijver).Encode(&bericht)
als fout!= nihil {
opbrengst
}
}

De eindpuntVoorbeeld handlerfunctie neemt een http pakket auteur En verzoek methode instantie en retourneert een bericht naar de client met de auteur voorbeeld.

Tariefbeperking van een Simple Go-toepassing

Tariefbeperking via het aantal verzoeken van een gebruiker of het beschikbare aantal verzoeken is vergelijkbaar. U moet altijd een begrenzer maken vóór het autorisatieproces.

Hier leest u hoe u een snelheidsbegrenzer kunt maken en gebruikers kunt autoriseren op basis van het aantal verzoeken.

funcrateLimiterMiddleware(volgende func(schrijver http. ResponseWriter, vraag *http. Verzoek)) http.HandlerFunc {
begrenzer := tarief. NieuweBegrenzer(3, 6) // max. 6 verzoeken en daarna nog drie verzoeken per seconde
opbrengst http. HandlerFunc(func(schrijver http. ResponseWriter, vraag *http. Verzoek) {
als !begrenzer. Toestaan() {
auteur. Schrijven([]byte("snelheidslimiet overschreden "))
opbrengst
} anders {
eindpuntVoorbeeld (schrijver, verzoek)
}
})
}

De rateLimiterMiddleware handler-functie is een middleware die een handler-functie als argument accepteert en het resultaat van de autorisatie retourneert na het maken van een nieuwe snelheidsbegrenzer met de NieuwLimiter methode die twee parameters nodig heeft voor het aantal verzoeken per seconde na het opgegeven maximum aantal verzoeken.

De Toestaan methode van de limiter-instantie retourneert een Booleaanse waarde op basis van de status van geautoriseerde verzoeken. De rateLimiterMiddleware retourneert het JSON-bericht als het verzoek is geautoriseerd of de "snelheidslimiet overschreden " bericht wanneer de client het maximale aantal verzoeken heeft verzonden.

funcvoornaamst() {
http. HandleFunc("/home", rateLimiterMiddleware (endpointExample))
fout := http. ListenAndServe(":8080", nihil)
als fout!= nihil {
loggen. Println("Er is een fout opgetreden bij het luisteren op poort:8080", fout)
}
}

De voornaamst functie koppelt de /home eindpunt naar de rateLimiterMiddleware handlerfunctie die de eindpuntVoorbeeld handler functie.

De ListenAndServe methode start een server op de localhost-poort 8080 en retourneert mogelijke fouten.

U kunt deze opdracht uitvoeren op de terminal van uw werkmap of met een bash-script om het eindpunt te testen nadat de server is uitgevoerd.

voor i in {1..10}; Doen Krul http://localhost: 8080/thuis; klaar

De code raakt de /home eindpunt tien keer met een verzoek. Hier zijn de resultaten van de verzoeken.

Na het zesde verzoek (maximaal) is de klant ongeautoriseerd en heeft hij geen toegang meer tot het eindpunt.

Snelheidsbeperking is belangrijk

Snelheidsbeperking is essentieel, vooral als u de kosten van het hosten van uw applicatie wilt verlagen, botinterferentie wilt verminderen of uw app wilt beveiligen tegen cyberaanvallen. gelijk aan die van Go tarief pakket, npm biedt de express-tarieflimiet pakket om spoedeisende toepassingen te beperken.