Greičio ribojimas yra strategija, kurią galite naudoti srautui tinkle valdyti. Tai riboja užklausų, kurias vartotojas gali pateikti per tam tikrą laikotarpį, skaičių.
Egzistuoja įvairūs greitį ribojantys algoritmai, kurių kiekvienas turi savo kompromisus. Vienas paprastas ir populiarus būdas yra sekti užklausų IP adresus ir patikrinti, kiek laiko praeina tarp užklausų. Tada sistema gali atmesti užklausą, jei jos IP adresas viršija leistiną užklausų skaičių.
Šį greičio ribojimo metodą lengva sukurti „NodeJS-Express“ programoje, atlikus vos kelis veiksmus.
1 veiksmas: kūrimo aplinkos nustatymas
Pirmiausia turėsite sukurti ir inicijuoti „Express“ programą.
Pradėkite kurdami projekto katalogą paleisdami:
mkdir express-app
Tada įveskite tą katalogą paleisdami:
cd greitoji programa
Toliau inicijuokite npm, mazgo paketų tvarkyklė, ir sukurti a package.json failą savo programoje paleisdami:
npm init -y
The -y vėliava sukurs jūsų package.json failą su visais numatytais nustatymais.
Tada turėsite įdiegti kai kurias priklausomybes. Šiai mokymo programai reikalingos priklausomybės:
- ExpressJS: ExpressJS yra NodeJS sistema kuri suteikia tvirtą funkcijų rinkinį žiniatinklio ir mobiliosioms programoms. Tai supaprastina užpakalinių programų kūrimo procesą naudojant NodeJS.
- Greitojo tarifo limitas: Greitojo greičio limitas yra greitį ribojanti tarpinė programinė įranga, skirta ExpressJS. Tai riboja pakartotines užklausas viešosioms API ir (arba) galutiniams taškams, pvz., slaptažodžio nustatymui iš naujo, naudotojų prisijungimams ir kt.
Įdiekite reikiamas priklausomybes paleisdami:
npm diegti greitasis greitasis kursas-riba
2 veiksmas: greitosios programos kūrimas
Turėsite sukurti pagrindinį „Express“ serverį, kuris išklausys jūsų programai teikiamas užklausas.
Pirmiausia sukurkite an index.js failą savo projekto šakniniame kataloge. Tai bus jūsų paraiškos įvedimo failas.
Tada pridėkite šį kodą prie savo index.js failas:
// index.js
konst išreikšti = reikalauti(„išreikšti“);
konst programa = express ();
konst prievadas = procesas.env. UOSTAS || 3000
app.listen (port, () => {
konsolė.log(„Programa veikia prievade ${port}`);
});
Šis kodas importuojamas išreikšti ir sukuria „Express“ programą iškviesdamas express() ir išsaugodamas jos grąžinamąją reikšmę programėlė kintamasis. Tada jis klauso srauto uoste 3000 paskambinus į klausyk metodas ant programėlė objektas.
3 veiksmas: maršruto tvarkyklių kūrimas
Tada sukurkite keletą maršrutų tvarkytuvų, kuriuose galite įdiegti greičio ribojimo sprendimą.
Pirmiausia sukurkite aplanką, maršrutus savo projekto šakniniame kataloge vykdydami:
mkdir maršrutai
Sukurti failą, routes.js, aplanke maršrutai ir pridėkite šį kodą:
konst išreikšti = reikalauti(„išreikšti“);
konst maršrutizatorius = greitasis. Maršrutizatorius ();router.get("/", (req, res) => {
res.send({ pranešimas: "Sveiki, tai yra GET užklausa" });
});router.post("/add-demo", (req, res) => {
res.status (201).send({ pranešimas: "Išteklius sėkmingai sukurtas" });
});router.put("/update-demo", (req, res) => {
res.status (201).send({ pranešimas: "Išteklius sėkmingai atnaujintas" });
});
modulis.eksportas = maršrutizatorius;
Šis kodas importuojamas išreikšti, skambina Maršrutizatorius metodas įjungtas išreikštiir išsaugo reikšmę kintamajame, maršrutizatorius. The Maršrutizatorius metodas leidžia kurti modulinius, montuojamus maršrutų tvarkykles. Galite sukurti maršruto tvarkykles a GAUTI prašyti "/“, a PAST prašyti "/add-demo“ ir a PUT prašyti "/update-demo”. Galiausiai eksportuokite maršrutizatorius kintamasis.
Tada importuokite maršrutizatorius kintamasis jūsų index.js failas:
// index.js
konst maršrutai = reikalauti(./routes/routes");
Tada naudokite jį kaip tarpinę programinę įrangą faile index.js:
// index.js
programėlė.naudoti(maršrutai);
Būtinai įdėkite kodo bloką aukščiau prieš app.klausykite skambinti.
4 veiksmas: normos ribojimo įgyvendinimas
Pirmiausia sukurkite „tarpinė programinė įranga“ aplanką savo projekto šakniniame kataloge paleisdami:
mkdir tarpinė programinė įranga
Tada sukurkite failą pavadinimu "rate-limiter.js“ tarpinės programinės įrangos kataloge. Pridėkite šį kodą prie šio failo:
// rate-limiter.js
konst normaLimiter = reikalauti("greito kurso riba");konst limiter = rateLimiter({
maks.: 5,
windowsMS: 10000, // 10 sekundžių
žinutė: "Tu gali'šiuo metu daugiau neteikite prašymų. Pabandyti dar kartą vėliau",
});
modulis.eksportas = ribotuvas
The normaLimiter funkcija paima konfigūracijos objektą su sąlygomis, kad apribotų užklausų skaičių.
Aukščiau esančio konfigūracijos objekto savybės yra šios:
- maks: Ši savybė visada turi būti a numerį arba funkcija, kuri grąžina skaičių. Tai rodo maksimalų užklausų skaičių, kurį vartotojas gali pateikti per nurodytą laikotarpį. Jei ši ypatybė nenustatyta konfigūracijos objekte, ji nustatoma pagal numatytuosius nustatymus 5.
- windowsMS: Ši savybė visada turi būti skaičius. Tai rodo laikotarpį, per kurį leidžiama pateikti keletą užklausų milisekundės. Jei ši ypatybė nenustatyta konfigūracijos objekte, ji pagal numatytuosius nustatymus yra 60 000 milisekundžių (viena minutė).
- žinutę: Ši nuosavybė gali būti a styga, JSON objektas arba bet kuri kita palaikoma reikšmė Express atsakymas.siųsti metodas. Jei ši ypatybė nenustatyta konfigūracijos objekte, ji pagal numatytuosius nustatymus yra „Per daug užklausų. Pabandykite dar kartą vėliau."
Tada funkcija patikrins, ar nėra pasikartojančių jūsų programos užklausų. Jei vartotojas viršija limitą (maks, 5) per laikotarpį (windowsMS, 10s), užklausa bus užblokuota. Taip pat bus rodoma klaida „Per daug užklausų“ su būsenos kodu 429.
Galiausiai importuokite ribotuvo funkciją į savo index.js failą ir pritaikykite jį kaip pasaulinę tarpinę programinę įrangą savo programoje. Padarykite tai padėdami app.use (ribotuvas) virš maršrutų tarpinės programinės įrangos. Tai taikomas visiems jūsų programos maršrutams tarifo ribojimo sprendimas.
programėlė.naudoti(ribotuvas);
Kainos ribojimas konkrečiuose maršrutuose
Taip pat galite taikyti tarifų ribojimą konkretiems maršrutams. Galite juos konfigūruoti atskirai, kad būtų atmestos užklausos, pateiktos per skirtingą laikotarpį, būtų rodomas kitas pranešimas ir pan.
Pavyzdžiui, tarkime, kad programoje įdiegiate vartotojo prisijungimo maršrutą. Gali reikėti pridėti tarifą ribojančią prisijungimo maršruto konfigūraciją, kuri skiriasi nuo konfigūracijos, naudojamos kituose maršrutuose.
Pirma, turėsite pašalinti ribotuvas kaip programos lygio tarpinę programinę įrangą ir pritaikykite ją, nes ExpressJS nėra integruotos tarpinės programinės įrangos filtrų sistemos. Taigi, net jei prie maršruto pridėsite konkretų tarifą ribojantį sprendimą, pasaulinė tarpinė programinė įranga vis tiek veiks tame maršrute.
Tada sukurkite naują greičio ribojimo konfigūraciją rate-limiter.js failą ir jį eksportuoti.
konst signInLimiter = rateLimiter({
maks.: 3,
windowsMS: 10000, //10 sekundžių
žinutė: "Per daug bandymų prisijungti. Pabandyti dar kartą vėliau."
})
modulis.eksportas = {
ribotuvas,
signInLimiter
}
The signInLimiter konfigūracijos objektas turi skirtingą skaičių maks užklausas ir kitokį klaidos pranešimą nuo bendrojo greičio ribotuvo.
Galiausiai atnaujinkite savo maršrutizatorius.js failą su žemiau esančiu kodų bloku:
// maršrutizatorius.js
konst išreikšti = reikalauti(„išreikšti“);
konst maršrutizatorius = greitasis. Maršrutizatorius ();
konst {limiter, signInLimiter} = reikalauti(../middleware/rate-limiter)router.get("/sign-in", signInLimiter, (req, res, next) => {
res.send({ pranešimas: "Sveiki, tai yra GET užklausa" });
});maršrutizatorius.naudoti(ribotuvas)
router.post("/post", (req, res) => {
res.status (201).send({ pranešimas: "Išteklius sėkmingai sukurtas" });
});router.put("/put", (req, res) => {
res.status (201).send({ pranešimas: "Išteklius sėkmingai atnaujintas" });
});
modulis.eksportas = maršrutizatorius;
Aukščiau esančiame kodo bloke importavote ribotuvas ir signInLimiter. Tada kreipėtės signInLimiter kaip konkretus normos ribotuvas „/sign-in“ maršrutą.
Galiausiai, padėdami router.use (ribotuvas) virš kitų maršrutų taikėte ribotuvą kaip greičio ribotuvą likusiems maršrutams.
Kainos ribojimo svarba
Apribojus greitį, sumažėja žiniatinklio serverio įtampa, nes nereikia vienu metu apdoroti per daug užklausų. Tai sumažina robotų aktyvumą, apsaugo jus nuo paslaugų atsisakymo (DoS) atakų ir apsaugo nuo žiaurios jėgos atakų.