I lettori come te aiutano a sostenere MUO. Quando effettui un acquisto utilizzando i link sul nostro sito, potremmo guadagnare una commissione di affiliazione.

Uno dei fattori che potresti prendere in considerazione durante la creazione della tua applicazione è la quantità di traffico che ti aspetti dagli utenti. La quantità di traffico eventualmente decide più fattori che possono includere l'allocazione delle risorse, specialmente se stai ospitando la tua app su un provider di servizi cloud.

La limitazione della velocità è una delle tecniche che puoi utilizzare per controllare il traffico sulla tua applicazione o rete.

Cos'è la limitazione della velocità?

La limitazione della velocità è una tecnica di restrizione dell'accesso diffusa per limitare il traffico di rete, principalmente entro intervalli di tempo ipotizzati o quando l'utente ha eseguito diverse richieste.

La limitazione della velocità è popolare per ridurre gli attacchi informatici come la forza bruta e DDoS (Distributed Denial of Service)

instagram viewer
, limitante raschiamento del web, richieste API e altre interazioni utente irregolari come l'automazione dei bot e il sovraccarico del server.

Go fornisce un supporto di prima classe per le applicazioni di limitazione della velocità in valutare pacchetto che fornisce un limitatore di velocità e interagisce con il tempo pacchetto.

IL valutare package fa parte del progetto Go, ma il pacchetto non è disponibile nella libreria standard. Dovrai installare il pacchetto con il file Ottenere comando.

Esegui questo comando nel terminale della tua directory di lavoro per aggiungere il pacchetto alle dipendenze del tuo progetto.

andare ottieni "golang.org/x/time/rate"

Importa questi pacchetti nel tuo file Go per questo tutorial.

importare (
"codifica/json"
"golang.org/x/time/rate"
"tronco d'albero"
"rete/http"
)

IL json package serve per codificare una struttura come JSON per il client. Userai il tronco d'albero pacchetto a tronco d'albero errori alla console e al http pacchetto per creare l'endpoint e il middleware e avviare un server.

Creazione di un'API semplice con un endpoint

Convenzionalmente, scriverai un middleware per le funzioni del gestore che desideri limitare. Ogni volta che l'utente invia una richiesta, il middleware convalida lo stato della richiesta prima di inoltrare l'accesso alla funzione di gestore, a seconda dei casi.

Ecco il modello struct con i campi stringa che codificherai al client.

tipo Messaggio struct {
Risposta corda`json:"risposta"`
Descrizione corda`json:"descrizione"`
}

La funzione del gestore imposterà il tipo di contenuto su JSON, scriverà un codice di stato corretto e restituirà un'istanza struct codificata al client.

funzendpointEsempio(scrittore http. ResponseWriter, richiesta *http. Richiesta) {
scrittore. Header().Set("Content-Type", "application/json")
scrittore. WriteHeader (http. StatoOK)
messaggio := Messaggio{
Risposta: "Riuscito",
Descrizione: "Hai raggiunto con successo l'endpoint API",
}
err := json. NewEncoder (scrittore).Codifica(&messaggio)
Se errare!= zero {
ritorno
}
}

IL endpointEsempio la funzione gestore accetta un file http pacchetto scrittore E richiesta istanza del metodo e restituisce un messaggio al client con il scrittore esempio.

Limitazione della velocità di un'applicazione Simple Go

La limitazione della velocità tramite il numero di richieste di un utente o il numero disponibile di richieste è simile. Dovrai sempre creare un limitatore prima del processo di autorizzazione.

Ecco come puoi creare un limitatore di velocità e autorizzare gli utenti in base al numero di richieste.

funzrateLimiterMiddleware(Prossimo funz(scrittore http. ResponseWriter, richiesta *http. Richiesta)) http.HandlerFunc {
limitatore := tasso. Nuovo limitatore(3, 6) // massimo di 6 richieste e poi altre tre richieste al secondo
ritorno http. HandlerFunc(funz(scrittore http. ResponseWriter, richiesta *http. Richiesta) {
Se !limitatore. Permettere() {
scrittore. Scrivere([]byte("limite di frequenza superato"))
ritorno
} altro {
endpointEsempio (scrittore, richiesta)
}
})
}

IL rateLimiterMiddleware La funzione gestore è un middleware che accetta una funzione gestore come argomento e restituisce il risultato dell'autorizzazione dopo aver creato un nuovo limitatore di velocità con il Nuovo limitatore metodo che accetta due parametri per il numero di richieste al secondo dopo le richieste massime specificate.

IL Permettere Il metodo dell'istanza del limitatore restituisce un valore booleano basato sullo stato delle richieste autorizzate. IL rateLimiterMiddleware restituisce il messaggio JSON se la richiesta è autorizzata o il "limite di frequenza superato" messaggio quando il client ha inviato il numero massimo di richieste.

funzprincipale() {
http. HandleFunc("/home", rateLimiterMiddleware (endpointEsempio))
err := http. AscoltaEServi(":8080", zero)
Se errare!= zero {
tronco d'albero. Println("Si è verificato un errore durante l'ascolto sulla porta:8080", ehm)
}
}

IL principale funzione monta il /home punto finale al rateLimiterMiddleware funzione del gestore che accetta il file endpointEsempio funzione di gestore.

IL Ascolta e servi Il metodo avvia un server sulla porta localhost 8080 e restituisce possibili errori.

Puoi eseguire questo comando sul terminale della tua directory di lavoro o con uno script bash per testare l'endpoint dopo aver eseguito il server.

per io In {1..10}; Fare arricciare http://localhost: 8080/domicilio; Fatto

Il codice colpisce il /home endpoint dieci volte con una richiesta. Ecco l'esito delle richieste.

Dopo la sesta richiesta (massimo), il client non è autorizzato e non può più accedere all'endpoint.

La limitazione della velocità è importante

La limitazione della velocità è essenziale, soprattutto se stai cercando di ridurre i costi di hosting della tua applicazione, vuoi ridurre l'interferenza dei bot o proteggere la tua app dagli attacchi informatici. Simile a Go's valutare pacchetto, npm fornisce il express-rate-limit pacchetto per applicazioni express rate-limit.