Что такое ограничитель скорости API?
Механизм, используемый для управления скоростью входящих запросов или операций для предотвращения перегрузки и защиты сервера от чрезмерного трафика.
Он устанавливает ограничения на количество запросов, которые могут быть сделаны в течение определенного периода времени, обычно в секунду, минуту или час. Используется в API, веб-серверах и распределенных системах для обеспечения добросовестного использования, поддержания стабильности системы и защиты от злоупотреблений или DoS-атак (отказ в обслуживании).
+--------------+ | | | Incoming | | Requests | +--------------+ | v +--------------+ +-----------------+ | | Exceed | | | | Threshold | | | Rate | -- > | Deny Request | | Checking | | | +--------------+ +-----------------+ | Within threshold v +---------------+ | | |Process Request| +---------------+
Ограничитель скорости работает, отслеживая количество запросов, сделанных клиентом, и сравнивая его с ограничением скорости. Если клиент превышает лимит, ограничитель скорости может реагировать по-разному, например возвращать сообщение об ошибке, откладывать запрос или временно блокировать дальнейшие запросы.
Реализация базового ограничителя скорости в Node.js
В этом примере мы будем использовать фреймворк «express» для создания API и пакет «node-rate-limiter-flexible» для ограничения скорости.
npm install express node-rate-limiter-flexible
Создайте функцию промежуточного программного обеспечения, которая будет отвечать за ограничение скорости запросов API.
const rateLimiter = require('node-rate-limiter-flexible').RateLimiterMemory; // Configure the rate limiter const limiter = new rateLimiter({ points: 10, // Maximum number of points (requests) allowed within the duration duration: 1, // Duration in seconds }); // Create the rate limiter middleware function const rateLimiterMiddleware = (req, res, next) => { limiter.consume(req.ip) // Track requests based on IP address .then(() => { next(); // Request within the rate limit, proceed to the next middleware }) .catch(() => { res.status(429).send('Too Many Requests'); // Request exceeded the rate limit }); }; // Set the rate limit to 10 requests per second for each IP address.
Примените промежуточное ПО ограничителя скорости к маршрутам API.
const express = require('express'); const app = express(); // Apply the rate limiter middleware to all API routes app.use(rateLimiterMiddleware); // Define your API routes app.get('/api/resource', (req, res) => { res.send('API response'); }); // Start the server app.listen(3000, () => { console.log('Server started on port 3000'); });