Čitatelji poput vas podržavaju MUO. Kada kupite putem poveznica na našoj stranici, možemo zaraditi partnersku proviziju.

Jedan od čimbenika koje biste trebali uzeti u obzir prilikom izrade svoje aplikacije je količina prometa koji očekujete od korisnika. Količina prometa vjerojatno odlučuje o više čimbenika koji mogu uključivati ​​raspodjelu resursa, posebno ako svoju aplikaciju hostirate na pružatelju usluga u oblaku.

Ograničenje brzine je jedna od tehnika koju možete koristiti za kontrolu prometa na vašoj aplikaciji ili mreži.

Što je ograničenje brzine?

Ograničavanje brzine je široko rasprostranjena tehnika ograničenja pristupa za ograničavanje mrežnog prometa, prvenstveno unutar nagađanih vremenskih okvira ili kada je korisnik izvršio nekoliko zahtjeva.

Ograničavanje stope popularno je za smanjenje kibernetičkih napada poput grube sile i DDoS (distribuirano uskraćivanje usluge), ograničavajući web struganje, API zahtjevi i druge nepravilne korisničke interakcije poput automatizacije robota i opterećenja poslužitelja.

instagram viewer

Go pruža prvoklasnu podršku za aplikacije s ograničenjem brzine u stopa paket koji nudi limitator brzine i interoperira s vrijeme paket.

The stopa paket je dio Go projekta, ali paket nije dostupan u standardnoj knjižnici. Morat ćete instalirati paket s dobiti naredba.

Pokrenite ovu naredbu u terminalu vašeg radnog direktorija da dodate paket u ovisnosti vašeg projekta.

ići dobiti "golang.org/x/time/rate"

Uvezite ove pakete u svoju Go datoteku za ovaj vodič.

uvoz (
"kodiranje/json"
"golang.org/x/time/rate"
"log"
"net/http"
)

The json paket je za kodiranje strukture kao JSON za klijenta. Vi ćete koristiti log paket za log pogreške na konzoli i http paket za izgradnju krajnje točke i međuopreme i pokretanje poslužitelja.

Izrada jednostavnog API-ja s jednom krajnjom točkom

Uobičajeno, napisat ćete međuprogram za funkcije rukovatelja koje želite ograničiti. Svaki put kada korisnik pošalje zahtjev, međuprogram provjerava status zahtjeva prije prosljeđivanja pristupa funkciji rukovatelja, ovisno o slučaju.

Evo modela strukture s poljima nizova koje ćete kodirati klijentu.

tip Poruka strukturirati {
Odgovor niz`json:"odgovor"`
Opis niz`json:"opis"`
}

Funkcija rukovatelja postavit će vrstu sadržaja na JSON, napisati uspješan statusni kod i vratiti kodiranu instancu strukture klijentu.

funkendpointExample(pisac http. ResponseWriter, zahtjev *http. Zahtjev) {
pisac. Header().Set("Content-Type", "application/json")
pisac. WriteHeader (http. Status OK)
poruka := Poruka{
Odgovor: "Uspješno",
Opis: "Uspješno ste pogodili API krajnju točku",
}
pogreška := json. NewEncoder (pisac).Encode(&message)
ako pogriješiti != nula {
povratak
}
}

The endpointExample funkcija rukovatelja preuzima an http paket pisac i zahtjev instanca metode i vraća poruku klijentu s pisac primjer.

Ograničenje stope jednostavne Go aplikacije

Slično je ograničenje stope putem broja zahtjeva korisnika ili dostupnog broja zahtjeva. Uvijek ćete morati izraditi limiter prije postupka autorizacije.

Evo kako možete stvoriti limitator brzine i autorizirati korisnike na temelju broja zahtjeva.

funkrateLimiterMiddleware(Sljedeći funk(pisac http. ResponseWriter, zahtjev *http. Zahtjev)) http.HandlerFunc {
limiter := stopa. NewLimiter(3, 6) // maksimalno 6 zahtjeva i zatim još tri zahtjeva u sekundi
povratak http. HandlerFunc(funk(pisac http. ResponseWriter, zahtjev *http. Zahtjev) {
ako !ograničivač. Dopusti() {
pisac. Pisati([]bajt("prekoračeno ograničenje brzine"))
povratak
} drugo {
endpointExample (pisač, zahtjev)
}
})
}

The rateLimiterMiddleware funkcija rukovatelja je posredni softver koji prihvaća funkciju rukovatelja kao argument i vraća rezultat autorizacije nakon stvaranja novog limitera brzine s NewLimiter metoda koja uzima dva parametra za broj zahtjeva u sekundi nakon navedenog maksimalnog broja zahtjeva.

The Dopusti metoda instance limitera vraća booleov temeljen na statusu ovlaštenih zahtjeva. The rateLimiterMiddleware vraća JSON poruku ako je zahtjev autoriziran ili "ograničenje brzine premašeno" poruka kada je klijent poslao maksimalan broj zahtjeva.

funkglavni() {
http. HandleFunc("/home", rateLimiterMiddleware (endpointExample))
pogriješiti := http. ListenAndServe(":8080", nula)
ako pogriješiti != nula {
log. Println("Došlo je do greške pri slušanju porta:8080", pogreška)
}
}

The glavni funkcija postavlja /home krajnja točka na rateLimiterMiddleware funkcija rukovatelja koja preuzima endpointExample funkcija rukovatelja.

The Slušajte i služite metoda pokreće poslužitelj na portu lokalnog hosta 8080 i vraća moguće greške.

Ovu naredbu možete pokrenuti na terminalu vašeg radnog direktorija ili s bash skripta za testiranje krajnje točke nakon pokretanja poslužitelja.

za ja u {1..10}; čini kovrča http://localhost: 8080/dom; učinjeno

Šifra pogodi /home krajnja točka deset puta sa zahtjevom. Evo rezultata zahtjeva.

Nakon šestog zahtjeva (maksimum), klijent je neautoriziran i više ne može pristupiti krajnjoj točki.

Ograničenje brzine je važno

Ograničenje brzine je bitno, posebno ako želite smanjiti troškove hostinga svoje aplikacije, želite smanjiti smetnje bota ili zaštititi svoju aplikaciju od cyber napada. Slično kao Go's stopa paket, npm pruža ograničenje ekspresne stope paket za ekspresne aplikacije s ograničenjem brzine.