Как оценить приложения Limit Go
Программирование

Как оценить приложения Limit Go

Ограничение скорости помогает уменьшить вмешательство ботов, а также обеспечивает безопасность вашего приложения. Воспользуйтесь встроенным в Go тарифным пакетом, чтобы повысить безопасность вашего приложения

Один из факторов, который вы, возможно, захотите учесть при создании своего приложения, – это количество трафика, которое вы ожидаете от пользователей. Количество трафика, возможно, определяет больше факторов, которые могут включать распределение ресурсов, особенно если вы размещаете свое приложение у провайдера облачных услуг

Ограничение скорости – это одна из техник, которую вы можете использовать для контроля трафика в вашем приложении или сети

Что такое ограничение скорости?

Ограничение скорости – это широко распространенная техника ограничения доступа для ограничения сетевого трафика, в основном в определенных временных рамках или когда пользователь выполнил несколько запросов

Ограничение скорости популярно для уменьшения кибер-атак типа грубой силы и DDoS (Distributed Denial of Service), ограничения веб-скрейпинга, запросов API и других нерегулярных взаимодействий пользователей, таких как автоматизация ботов и нагрузка на сервер

Go обеспечивает первоклассную поддержку приложений для ограничения скорости в пакете rate, который предоставляет ограничитель скорости и взаимодействует с пакетом time

Пакет rate является частью проекта Go, но пакет не доступен в стандартной библиотеке. Вам потребуется установить пакет с помощью команды get

Выполните эту команду в терминале вашего рабочего каталога, чтобы добавить пакет в зависимости вашего проекта

go get 'golang.org/x/time/rate'

Импортируйте эти пакеты в ваш файл Go для этого учебника

import (
'encoding/json'
'golang.org/x/time/rate'
'log'
'net/http'
)

Пакет json предназначен для кодирования struct в виде JSON для клиента. Вы будете использовать пакет log для регистрации ошибок в консоли и пакет http для создания конечной точки и промежуточного программного обеспечения и запуска сервера

Создание простого API с одной конечной точкой

Как правило, вы пишете промежуточное ПО для функций-обработчиков, которые вы хотите ограничить по скорости. Каждый раз, когда пользователь отправляет запрос, промежуточное ПО проверяет статус запроса, прежде чем передать доступ к функции-обработчику, в зависимости от конкретного случая

Вот модель struct со строковыми полями, которые вы будете кодировать для клиента

type Message struct {
Response string `json:'response'`
Description string `json:'description'`
}

Функция-обработчик установит тип содержимого JSON, напишет код успешного статуса и вернет клиенту закодированный экземпляр struct

func endpointExample(writer http.ResponseWriter, request *http.Request) {
writer.Header().Set('Content-Type', 'application/json')
writer.WriteHeader(http.StatusOK)
message := Message{
Response: 'Successful',
Description: 'You've successfully hit the API endpoint',
}
err := json.NewEncoder(writer).Encode(&message)
if err != nil {
return
}
}

Функция обработчика endpointExample принимает экземпляр писателя http-пакета и метода запроса и возвращает клиенту сообщение с экземпляром писателя

Ограничение скорости простого приложения Go

Ограничение скорости по количеству запросов пользователя или доступному количеству запросов аналогично. Вам всегда нужно будет создавать ограничитель перед процессом авторизации

Вот как можно создать ограничитель скорости и авторизировать пользователей на основе количества запросов

func rateLimiterMiddleware(next func(writer http.ResponseWriter, request *http.Request)) http.HandlerFunc {
limiter := rate.NewLimiter(3, 6) // max of 6 requests and then three more requests per second
return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
if !limiter.Allow() {
writer.Write([]byte('rate limit exceeded '))
return
} else {
endpointExample(writer, request)
}
})
}

Функция-обработчик rateLimiterMiddleware – это промежуточное ПО, которое принимает функцию-обработчик в качестве аргумента и возвращает результат авторизации после создания нового ограничителя скорости методом NewLimiter, который принимает два параметра для количества запросов в секунду после заданного максимального количества запросов

Метод Allow экземпляра ограничителя возвращает булево значение, основанное на статусе авторизованных запросов.RateLimiterMiddleware возвращает сообщение JSON, если запрос авторизован, или сообщение ‘rate limit exceeded ‘, если клиент отправил максимальное количество запросов

func main() {
http.HandleFunc('/home', rateLimiterMiddleware(endpointExample))
err := http.ListenAndServe(':8080', nil)
if err != nil {
log.Println('There was an error listening on port :8080', err)
}
}

Функция main монтирует конечную точку /home к функции-обработчику rateLimiterMiddleware, которая принимает функцию-обработчик endpointExample

Метод ListenAndServe запускает сервер на порту localhost 8080 и возвращает возможные ошибки

Вы можете выполнить эту команду в терминале вашего рабочего каталога или с помощью сценария bash для тестирования конечной точки после запуска сервера

for i in {1. 10}; do curl http://localhost:8080/home; done

Код обращается к конечной точке /home десять раз с запросом. Вот результат запросов

После шестого запроса (максимум) клиент становится неавторизованным и больше не может получить доступ к конечной точке

Ограничение скорости очень важно

Ограничение скорости очень важно, особенно если вы хотите сократить расходы на хостинг вашего приложения, уменьшить вмешательство ботов или защитить ваше приложение от кибер-атак. Подобно пакету rate в Go, npm предоставляет пакет express-rate-limit для ограничения скорости экспресс-приложений

Об авторе

Алексей Белоусов

Привет, меня зовут Филипп. Я фрилансер энтузиаст . В свободное время занимаюсь переводом статей и пишу о потребительских технологиях для широкого круга изданий , не переставая питать большую страсть ко всему мобильному =)

Комментировать

Оставить комментарий