Tokie skaitytojai kaip jūs padeda palaikyti MUO. Kai perkate naudodami nuorodas mūsų svetainėje, galime uždirbti filialų komisinius.

Vienas iš veiksnių, į kurį galbūt norėsite atsižvelgti kurdami programą, yra srauto, kurio tikitės iš vartotojų, kiekis. Srauto kiekis gali nulemti daugiau veiksnių, kurie gali apimti išteklių paskirstymą, ypač jei savo programą priglobiate debesies paslaugų teikėje.

Greičio ribojimas yra vienas iš būdų, kurį galite naudoti norėdami valdyti srautą programoje ar tinkle.

Kas yra tarifo ribojimas?

Greičio ribojimas yra plačiai paplitęs prieigos ribojimo metodas, skirtas tinklo srautui apriboti, visų pirma per numatytą laikotarpį arba kai vartotojas įvykdo keletą užklausų.

Kainos ribojimas yra populiarus siekiant sumažinti kibernetines atakas, pvz., brutalią jėgą ir DDoS (paskirstytas atsisakymas teikti paslaugą), ribojantis tinklo grandymas, API užklausos ir kitos nereguliarios vartotojo sąveikos, pvz., robotų automatizavimas ir serverio įtempimas.

„Go“ teikia aukščiausios klasės greitį ribojančių programų palaikymą

instagram viewer
norma paketas, kuriame yra greičio ribotuvas ir sąveikauja su laikas paketą.

The norma paketas yra „Go“ projekto dalis, tačiau paketo nėra standartinėje bibliotekoje. Turėsite įdiegti paketą su gauti komandą.

Paleiskite šią komandą savo darbo katalogo terminale, kad pridėtumėte paketą prie projekto priklausomybių.

eik gauti „golang.org/x/time/rate“

Importuokite šiuos paketus į savo Go failą, skirtą šiai mokymo programai.

importuoti (
"kodavimas/json"
„golang.org/x/time/rate“
"rąstas"
"net/http"
)

The json paketas skirtas koduoti struktūrą kaip JSON klientui. Jūs naudosite žurnalas paketą į žurnalas klaidos konsolėje ir http paketą, kad sukurtumėte galutinį tašką ir tarpinę programinę įrangą bei paleistumėte serverį.

Sukurkite paprastą API su vienu galutiniu tašku

Paprastai parašysite tarpinę programinę įrangą tvarkyklės funkcijoms, kurias norite apriboti. Kiekvieną kartą, kai vartotojas siunčia užklausą, tarpinė programinė įranga patvirtina užklausos būseną prieš perduodama prieigą prie tvarkyklės funkcijos, priklausomai nuo atvejo.

Štai struktūros modelis su eilučių laukais, kuriuos užkoduosite klientui.

tipo Pranešimas struktūra {
Atsakymas styga`json:"atsakymas"".
apibūdinimas styga`json:"description"'
}

Valdiklio funkcija nustatys turinio tipą į JSON, parašys sėkmingą būsenos kodą ir grąžins užkoduotą struktūros egzempliorių klientui.

funcpabaigos taškasPavyzdys(rašytojas http. ResponseWriter, užklausa *http. užklausa) {
rašytojas. Header().Set("Content-Type", "application/json")
rašytojas. WriteHeader (http. BūsenaGerai)
pranešimas := Pranešimas{
Atsakymas: „Sėkmingai“,
Aprašymas: „Sėkmingai pasiekėte API galinį tašką“,
}
klaida := json. NewEncoder (rašytojas).Kodavimas (&pranešimas)
jeigu klysta! = nulis {
grąžinti
}
}

The pabaigos taškasPavyzdys tvarkyklės funkcija paima an http paketą rašytojas ir prašymas metodo egzempliorius ir klientui grąžina pranešimą su rašytojas instancija.

Kainos ribojimas „Simple Go“ programai

Kainos ribojimas pagal vartotojo užklausų skaičių arba galimą užklausų skaičių yra panašus. Prieš autorizacijos procesą visada turėsite sukurti ribotuvą.

Štai kaip galite sukurti greičio ribotuvą ir įgalioti naudotojus pagal užklausų skaičių.

funcrateLimiterMiddleware(Kitas func(rašytojas http. ResponseWriter, užklausa *http. užklausa)) http.HandlerFunc {
ribotuvas := norma. NewLimiter(3, 6) // daugiausia 6 užklausos ir dar trys užklausos per sekundę
grąžinti http. HandlerFunc(func(rašytojas http. ResponseWriter, užklausa *http. užklausa) {
jeigu !ribotuvas. Leisti () {
rašytojas. Rašyti ([]baitas("viršytas normos limitas"))
grąžinti
} Kitas {
endpointPavyzdys (rašytojas, užklausa)
}
})
}

The rateLimiterMiddleware tvarkyklės funkcija yra tarpinė programinė įranga, kuri priima tvarkyklės funkciją kaip argumentą ir grąžina autorizavimo rezultatą sukūrus naują greičio ribotuvą su NewLimiter metodas, kuris paima du parametrus užklausų skaičiui per sekundę po nurodyto maksimalaus užklausų skaičiaus.

The Leisti ribotuvo egzemplioriaus metodas grąžina loginę vertę, pagrįstą įgaliotų užklausų būsena. The rateLimiterMiddleware grąžina JSON pranešimą, jei užklausa yra įgaliota arba "viršytas normos limitas" pranešimą, kai klientas išsiuntė didžiausią užklausų skaičių.

funcpagrindinis() {
http. HandleFunc("/home", rateLimiterMiddleware (endpointExample))
klaida := http. ListenAndServe (":8080", nulis)
jeigu klysta! = nulis {
žurnalas. Println("Įvyko klaida klausantis prievado:8080“, klaida)
}
}

The pagrindinis funkcija pritvirtina /home galinis taškas į rateLimiterMiddleware tvarkyklės funkcija, kuri perima pabaigos taškasPavyzdys prižiūrėtojo funkcija.

The KlausykIr Tarnaukite metodas paleidžia serverį per localhost prievadą 8080 ir grąžina galimas klaidas.

Šią komandą galite paleisti savo darbo katalogo terminale arba su bash scenarijus norėdami išbandyti galinį tašką paleidę serverį.

dėl i in {1..10}; daryti garbanoti http://localhost: 8080/namai; padaryta

Kodas pasiekia /home galinį tašką dešimt kartų su prašymu. Štai užklausų rezultatai.

Po šeštos užklausos (maksimaliai) klientas yra neteisėtas ir nebegali pasiekti galinio taško.

Kainos ribojimas yra svarbus

Greitis yra labai svarbus, ypač jei norite sumažinti programos prieglobos išlaidas, norite sumažinti robotų trukdžius arba apsaugoti programą nuo kibernetinių atakų. Panašus į Go's norma paketą, npm suteikia greitojo tarifo limitas greitųjų programų paketą.