Leser wie Sie helfen, MUO zu unterstützen. Wenn Sie über Links auf unserer Website einen Kauf tätigen, erhalten wir möglicherweise eine Affiliate-Provision.

Einer der Faktoren, die Sie beim Erstellen Ihrer Anwendung berücksichtigen sollten, ist die Menge an Datenverkehr, die Sie von Benutzern erwarten. Die Menge des Datenverkehrs entscheidet möglicherweise über weitere Faktoren, die die Ressourcenzuweisung umfassen können, insbesondere wenn Sie Ihre App bei einem Cloud-Dienstanbieter hosten.

Ratenbegrenzung ist eine der Techniken, die Sie verwenden können, um den Datenverkehr in Ihrer Anwendung oder Ihrem Netzwerk zu kontrollieren.

Was ist Ratenbegrenzung?

Ratenbegrenzung ist eine weit verbreitete Zugriffsbeschränkungstechnik zur Begrenzung des Netzwerkverkehrs, hauptsächlich innerhalb spekulierter Zeitrahmen oder wenn der Benutzer mehrere Anfragen ausgeführt hat.

Ratenbegrenzung ist beliebt, um Cyber-Angriffe wie Brute Force und DDoS (Distributed Denial of Service), begrenzen Web-Scraping, API-Anfragen und andere unregelmäßige Benutzerinteraktionen wie Bot-Automatisierung und Serverbelastung.

instagram viewer

Go bietet erstklassige Unterstützung für ratenbegrenzende Anwendungen im Rate Paket, das einen Ratenbegrenzer bereitstellt und mit dem zusammenarbeitet Zeit Paket.

Der Rate Das Paket ist Teil des Go-Projekts, aber das Paket ist nicht in der Standardbibliothek verfügbar. Sie müssen das Paket mit dem installieren erhalten Befehl.

Führen Sie diesen Befehl im Terminal Ihres Arbeitsverzeichnisses aus, um das Paket zu den Abhängigkeiten Ihres Projekts hinzuzufügen.

gehen Holen Sie sich "golang.org/x/time/rate"

Importieren Sie diese Pakete für dieses Tutorial in Ihre Go-Datei.

importieren (
"Codierung/json"
"golang.org/x/time/rate"
"Protokoll"
"net/http"
)

Der json Das Paket dient zum Codieren einer Struktur als JSON für den Client. Sie verwenden die Protokoll Paket zu Protokoll Fehler an der Konsole und der http Paket, um den Endpunkt und die Middleware zu erstellen und einen Server zu starten.

Erstellen einer einfachen API mit einem Endpunkt

Herkömmlicherweise schreiben Sie eine Middleware für die Handler-Funktionen, die Sie einschränken möchten. Jedes Mal, wenn der Benutzer eine Anfrage sendet, validiert die Middleware den Anfragestatus, bevor sie je nach Fall den Zugriff an die Handler-Funktion weiterleitet.

Hier ist das Strukturmodell mit Zeichenfolgenfeldern, die Sie für den Client codieren.

Typ Nachricht Struktur {
Antwort Schnur`json:"Antwort"`
Beschreibung Schnur`json:"Beschreibung"`
}

Die Handler-Funktion setzt den Inhaltstyp auf JSON, schreibt einen erfolgreichen Statuscode und gibt eine verschlüsselte Strukturinstanz an den Client zurück.

FunkEndpunktBeispiel(Autor http. ResponseWriter, Anfrage *http. Anfrage) {
Schriftsteller. Header().Set("Content-Type", "application/json")
Schriftsteller. WriteHeader (http. StatusOK)
Nachricht := Nachricht{
Antwort: "Erfolgreich",
Beschreibung: "Sie haben den API-Endpunkt erfolgreich erreicht",
}
Fehler := json. NewEncoder (writer).Encode(&message)
Wenn äh != Null {
zurückkehren
}
}

Der EndpunktBeispiel Handler-Funktion übernimmt eine http Paket Schriftsteller Und Anfrage -Methodeninstanz und gibt eine Nachricht an den Client mit der zurück Schriftsteller Beispiel.

Ratenbegrenzung einer einfachen Go-Anwendung

Die Ratenbegrenzung über die Anzahl der Anfragen eines Benutzers oder die verfügbare Anzahl von Anfragen ist ähnlich. Sie müssen vor dem Autorisierungsprozess immer einen Limiter erstellen.

So können Sie einen Ratenbegrenzer erstellen und Benutzer basierend auf der Anzahl der Anfragen autorisieren.

FunkrateLimiterMiddleware(nächste Funk(Autor http. ResponseWriter, Anfrage *http. Anfrage)) http.HandlerFunc {
Begrenzer := Rate. NewLimiter(3, 6) // max. 6 Anfragen und dann drei weitere Anfragen pro Sekunde
zurückkehren http. HandlerFunc(Funk(Autor http. ResponseWriter, Anfrage *http. Anfrage) {
Wenn !Begrenzer. Erlauben() {
Schriftsteller. Schreiben([]Byte("Frequenzgrenze überschritten "))
zurückkehren
} anders {
endpointExample (Writer, Anfrage)
}
})
}

Der rateLimiterMiddleware Handler-Funktion ist eine Middleware, die eine Handler-Funktion als Argument akzeptiert und das Ergebnis der Autorisierung zurückgibt, nachdem ein neuer Ratenbegrenzer mit erstellt wurde NewLimiter Methode, die zwei Parameter für die Anzahl der Anfragen pro Sekunde nach den angegebenen maximalen Anfragen akzeptiert.

Der Erlauben -Methode der Limiter-Instanz gibt einen booleschen Wert basierend auf dem Status der autorisierten Anfragen zurück. Der rateLimiterMiddleware gibt die JSON-Nachricht zurück, wenn die Anfrage autorisiert ist oder die "Frequenzgrenze überschritten " Nachricht, wenn der Client die maximale Anzahl von Anfragen gesendet hat.

Funkhauptsächlich() {
http. HandleFunc("/home", rateLimiterMiddleware (endpointExample))
Fehler := http. ListenAndServe(":8080", Null)
Wenn äh != Null {
Protokoll. Println("Fehler beim Abhören von Port:8080", irren)
}
}

Der hauptsächlich Funktion mountet die /home Endpunkt zum rateLimiterMiddleware Handler-Funktion, die die übernimmt EndpunktBeispiel Handler-Funktion.

Der ListenAndServe -Methode startet einen Server am localhost-Port 8080 und gibt mögliche Fehler zurück.

Sie können diesen Befehl auf dem Terminal Ihres Arbeitsverzeichnisses oder mit ausführen ein Bash-Skript um den Endpunkt nach dem Ausführen des Servers zu testen.

für ich In {1..10}; Tun kräuseln http://localhost: 8080/home; Erledigt

Der Code trifft die /home endpoint zehnmal mit einer Anfrage. Hier sind die Ergebnisse der Anfragen.

Nach der sechsten Anfrage (maximal) ist der Client nicht mehr autorisiert und kann nicht mehr auf den Endpunkt zugreifen.

Ratenbegrenzung ist wichtig

Eine Ratenbegrenzung ist unerlässlich, insbesondere wenn Sie die Kosten für das Hosten Ihrer Anwendung senken, Bot-Interferenzen reduzieren oder Ihre Anwendung vor Cyberangriffen schützen möchten. Ähnlich wie Gos Rate Paket stellt npm die Express-Rate-Limit Paket zur Ratenbegrenzung von Expressanwendungen.