Cititorii ca tine ajută la sprijinirea MUO. Când efectuați o achiziție folosind link-uri de pe site-ul nostru, este posibil să câștigăm un comision de afiliat.

Unul dintre factorii pe care poate doriți să îi luați în considerare atunci când vă construiți aplicația este volumul de trafic pe care îl așteptați de la utilizatori. Cantitatea de trafic poate decide mai mulți factori care pot include alocarea resurselor, mai ales dacă găzduiți aplicația pe un furnizor de servicii cloud.

Limitarea ratei este una dintre tehnicile pe care le puteți utiliza pentru a controla traficul în aplicația sau rețeaua dvs.

Ce este limitarea ratei?

Limitarea ratei este o tehnică de restricție a accesului pe scară largă pentru limitarea traficului de rețea, în primul rând în intervale de timp speculate sau când utilizatorul a executat mai multe solicitări.

Limitarea ratei este populară pentru reducerea atacurilor cibernetice, cum ar fi forța brută și DDoS (Distributed Denial of Service), limitare răzuire web, solicitări API și alte interacțiuni neregulate ale utilizatorului, cum ar fi automatizarea botului și solicitarea serverului.

instagram viewer

Go oferă suport de primă clasă pentru aplicațiile de limitare a ratei din rată pachet care oferă un limitator de rată și interoperează cu timp pachet.

The rată pachetul face parte din proiectul Go, dar pachetul nu este disponibil în biblioteca standard. Va trebui să instalați pachetul cu obține comanda.

Rulați această comandă în terminalul directorului de lucru pentru a adăuga pachetul la dependențele proiectului.

merge obțineți „golang.org/x/time/rate”

Importați aceste pachete în fișierul Go pentru acest tutorial.

import (
"encoding/json"
„golang.org/x/time/rate”
"Buturuga"
"net/http"
)

The json pachetul este pentru codificarea unei structuri ca JSON pentru client. Veți folosi Buturuga pachet la Buturuga erori la consolă și la http pachet pentru a construi endpoint-ul și middleware-ul și pentru a porni un server.

Construirea unui API simplu cu un singur punct final

În mod convențional, veți scrie un middleware pentru funcțiile de gestionare pe care doriți să le limitați. De fiecare dată când utilizatorul trimite o solicitare, middleware-ul validează starea solicitării înainte de a transmite accesul la funcția de gestionare, în funcție de caz.

Iată modelul struct cu câmpuri de șir pe care le veți codifica pentru client.

tip Mesaj struct {
Raspuns şir`json:"răspuns"`
Descriere şir`json:"descriere"`
}

Funcția de gestionare va seta tipul de conținut la JSON, va scrie un cod de stare de succes și va returna clientului o instanță de structură codificată.

funcendpointExample(scriitor http. ResponseWriter, solicitați *http. Cerere) {
scriitor. Header().Set(„Content-Type”, „application/json”)
scriitor. WriteHeader (http. StareOK)
mesaj := Mesaj{
Răspuns: „Succes”,
Descriere: „Ați atins cu succes punctul final API”,
}
err := json. NewEncoder (scriitor).Codificare(&mesaj)
dacă greș!= zero {
întoarcere
}
}

The endpointExample funcția de gestionare preia un http pachet scriitor și cerere instanta metodei si returneaza un mesaj clientului cu scriitor instanță.

Limitarea ratei unei aplicații Simple Go

Limitarea ratei prin numărul de solicitări al unui utilizator sau numărul disponibil de solicitări este similară. Va trebui întotdeauna să creați un limitator înainte de procesul de autorizare.

Iată cum puteți crea un limitator de rată și puteți autoriza utilizatorii în funcție de numărul de solicitări.

funcrateLimiterMiddleware(Următorul func(scriitor http. ResponseWriter, solicitați *http. Cerere)) http.HandlerFunc {
limitator := rate. NewLimiter(3, 6) // maxim 6 cereri și apoi încă trei solicitări pe secundă
întoarcere http. HandlerFunc(func(scriitor http. ResponseWriter, solicitați *http. Cerere) {
dacă !limitator. Permite() {
scriitor. Scrie([]octet("limita ratei a fost depășită"))
întoarcere
} altfel {
endpointExample (scriitor, cerere)
}
})
}

The rateLimiterMiddleware funcția handler este un middleware care acceptă o funcție handler ca argument și returnează rezultatul autorizării după crearea unui nou limitator de rată cu NewLimiter metodă care ia doi parametri pentru numărul de cereri pe secundă după cererile maxime specificate.

The Permite metoda instanței limitatorului returnează un boolean bazat pe starea cererilor autorizate. The rateLimiterMiddleware returnează mesajul JSON dacă cererea este autorizată sau "limita ratei a fost depasita" mesaj atunci când clientul a trimis numărul maxim de solicitări.

funcprincipal() {
http. HandleFunc("/home", rateLimiterMiddleware (endpointExample))
greșit := http. ListenAndServe(":8080", zero)
dacă greș!= zero {
Buturuga. Println("A apărut o eroare la ascultare pe portul:8080", gres)
}
}

The principal funcția montează /home punctul final la rateLimiterMiddleware funcția de gestionare care preia endpointExample funcția de manipulare.

The ListenAndServe metoda pornește un server pe portul localhost 8080 și returnează posibile erori.

Puteți rula această comandă pe terminalul directorului de lucru sau cu un script bash pentru a testa punctul final după rularea serverului.

pentru i în {1..10}; do răsuci http://localhost: 8080/acasa; Terminat

Codul lovește /home punctul final de zece ori cu o solicitare. Iată rezultatul solicitărilor.

După a șasea solicitare (maxim), clientul este neautorizat și nu mai poate accesa punctul final.

Limitarea ratelor este importantă

Limitarea ratei este esențială, mai ales dacă doriți să reduceți costul găzduirii aplicației dvs., dacă doriți să reduceți interferența botului sau să vă protejați aplicația de atacurile cibernetice. Similar cu Go's rată pachet, npm oferă limita-rată-express pachet pentru limitarea ratei aplicațiilor expres.