Läsare som du hjälper till att stödja MUO. När du gör ett köp med hjälp av länkar på vår webbplats kan vi tjäna en affiliate-provision.

En av faktorerna du kanske vill överväga när du bygger din applikation är mängden trafik du förväntar dig från användarna. Mängden trafik avgör möjligen fler faktorer som kan inkludera resursallokering, särskilt om du är värd för din app hos en molntjänstleverantör.

Hastighetsbegränsning är en av teknikerna du kan använda för att kontrollera trafiken på din applikation eller ditt nätverk.

Vad är prisbegränsande?

Hastighetsbegränsning är en utbredd teknik för åtkomstbegränsning för att begränsa nätverkstrafik, främst inom spekulerade tidsramar eller när användaren har utfört flera förfrågningar.

Hastighetsbegränsning är populärt för att minska cyberattacker som brute force och DDoS (Distributed Denial of Service), begränsande webbskrapning, API-förfrågningar och andra oregelbundna användarinteraktioner som botautomatisering och serverbelastning.

Go ger förstklassigt stöd för hastighetsbegränsande applikationer i

instagram viewer
Betygsätta paket som tillhandahåller en hastighetsbegränsare och samverkar med tid paket.

De Betygsätta paketet är en del av Go-projektet, men paketet är inte tillgängligt i standardbiblioteket. Du måste installera paketet med skaffa sig kommando.

Kör det här kommandot i terminalen i din arbetskatalog för att lägga till paketet till ditt projekts beroenden.

 hämta "golang.org/x/time/rate"

Importera dessa paket till din Go-fil för den här handledningen.

importera (
"encoding/json"
"golang.org/x/time/rate"
"logga"
"net/http"
)

De json paketet är för att koda en struktur som JSON till klienten. Du kommer att använda logga paketera till logga fel på konsolen och http paket för att bygga slutpunkten och mellanvaran och starta en server.

Bygga ett enkelt API med en slutpunkt

Konventionellt kommer du att skriva en mellanprogramvara för de hanterarfunktioner du vill sätta en gräns för. Varje gång användaren skickar en förfrågan, validerar mellanvaran förfrågningsstatusen innan den vidarebefordrar åtkomst till hanterarfunktionen, beroende på fallet.

Här är strukturmodellen med strängfält som du ska koda till klienten.

typ Meddelande struktur {
Svar sträng`json:"svar"`
Beskrivning sträng`json:"beskrivning"`
}

Hanterarfunktionen kommer att ställa in innehållstypen till JSON, skriva en framgångsrik statuskod och returnera en kodad struct-instans till klienten.

funcslutpunktExempel(författare http. ResponseWriter, begär *http. Begäran) {
författare. Header().Set("Content-Type", "application/json")
författare. WriteHeader (http. StatusOK)
meddelande := meddelande{
Svar: "Lyckad",
Beskrivning: "Du har lyckats nå API-slutpunkten",
}
fel := json. NewEncoder (writer).Encode(&meddelande)
om fel!= noll {
lämna tillbaka
}
}

De slutpunktExempel hanterarfunktionen tar in en http paket författare och begäran metodinstans och returnerar ett meddelande till klienten med författare exempel.

Prisbegränsande en Simple Go-applikation

Prisbegränsning via en användares antal förfrågningar eller det tillgängliga antalet förfrågningar är liknande. Du måste alltid skapa en limiter innan auktoriseringsprocessen.

Så här kan du skapa en hastighetsbegränsare och auktorisera användare baserat på antalet förfrågningar.

funcrateLimiterMellanprogram(Nästa func(författare http. ResponseWriter, begär *http. Begäran)) http.HandlerFunc {
begränsare := hastighet. NewLimiter(3, 6) // max 6 förfrågningar och sedan ytterligare tre förfrågningar per sekund
lämna tillbaka http. HandlerFunc(func(författare http. ResponseWriter, begär *http. Begäran) {
om !begränsare. Tillåt() {
författare. Skriva([]byte("skattegränsen har överskridits"))
lämna tillbaka
} annan {
endpointExample (skribent, begäran)
}
})
}

De rateLimiterMellanprogram hanterarfunktionen är en mellanprogramvara som accepterar en hanterarfunktion som argument och returnerar resultatet av auktoriseringen efter att ha skapat en ny hastighetsbegränsare med NewLimiter metod som tar två parametrar för antalet förfrågningar per sekund efter det angivna maximala antalet förfrågningar.

De Tillåta metoden för limiter-instansen returnerar ett booleskt värde baserat på statusen för auktoriserade förfrågningar. De rateLimiterMellanprogram returnerar JSON-meddelandet om begäran är auktoriserad eller "skattegränsen har överskridits" meddelande när klienten har skickat maximalt antal förfrågningar.

funchuvud() {
http. HandleFunc("/home", rateLimiterMiddleware (endpointExample))
fel := http. ListenAndServe(":8080", noll)
om fel!= noll {
logga. Println("Det uppstod ett fel när porten lyssnade:8080", fel)
}
}

De huvud funktionen monterar /home slutpunkt till rateLimiterMellanprogram hanterarfunktion som tar in slutpunktExempel hanterarfunktion.

De ListenAndServe metod startar en server på localhost-porten 8080 och returnerar möjliga fel.

Du kan köra detta kommando på terminalen i din arbetskatalog eller med ett bash-manus för att testa slutpunkten efter att ha kört servern.

för i i {1..10}; do ringla http://localhost: 8080/hem; Gjort

Koden träffar /home slutpunkt tio gånger med en begäran. Här är resultatet av förfrågningarna.

Efter den sjätte begäran (maximalt) är klienten obehörig och kan inte längre komma åt slutpunkten.

Prisbegränsning är viktigt

Det är viktigt att begränsa hastigheten, särskilt om du vill minska kostnaderna för att vara värd för din applikation, vill minska botinterferens eller säkra din app från cyberattacker. Liknar Go's Betygsätta paket, npm tillhandahåller uttrycklig räntegräns paket för att hastighetsbegränsa expressapplikationer.