https://github.com/tamper000/rate-limit-redis
Lightweight and simple rate-limit middleware using Redis
https://github.com/tamper000/rate-limit-redis
go golang rate-limit ratelimit redis
Last synced: 2 months ago
JSON representation
Lightweight and simple rate-limit middleware using Redis
- Host: GitHub
- URL: https://github.com/tamper000/rate-limit-redis
- Owner: tamper000
- Created: 2025-07-26T04:40:19.000Z (2 months ago)
- Default Branch: main
- Last Pushed: 2025-07-26T05:55:31.000Z (2 months ago)
- Last Synced: 2025-07-26T11:25:20.836Z (2 months ago)
- Topics: go, golang, rate-limit, ratelimit, redis
- Language: Go
- Homepage:
- Size: 4.88 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# HTTP Rate Limiter Middleware
[](LICENSE)
HTTP rate limiting middleware для Go приложений с использованием Redis. Поддерживает Cloudflare и другие proxy-серверы.
## Особенности
- 🚀 Ограничение количества HTTP запросов по IP адресу
- ☁️ Поддержка Cloudflare (`CF-Connecting-IP`) и стандартных proxy (`X-Forwarded-For`)
- 🔧 Два варианта middleware: базовый и с логгированием через `slog`
- 📦 Простая интеграция с любым HTTP роутером
- ⚡ Высокая производительность с использованием Redis pipeline## Установка
```bash
go get github.com/tamper000/rate-limit-redis@latest
```## Быстрый старт
```go
package mainimport (
"fmt"
"net/http"
"time""github.com/redis/go-redis/v9"
ratelimit "github.com/tamper000/rate-limit-redis"
)func main() {
// Создание Redis клиента
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
DB: 0,
})// Конфигурация rate limiter
config := ratelimit.Config{
RedisClient: rdb,
MaxRequests: 100, // максимум 100 запросов
Duration: time.Hour, // в час
}// Создание limiter
limiter := ratelimit.NewLimiter(config)// Создание HTTP handler
mux := http.NewServeMux()
mux.HandleFunc("/api", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello API!")
})// Оборачивание в middleware
handler := limiter.Middleware(mux)fmt.Println("Server starting on :8080")
http.ListenAndServe(":8080", handler)
}
```## Использование с логгированием
```go
// Middleware с логгированием через slog
handler := limiter.MiddlewareWithSlog(mux)
```## Конфигурация
```go
type Config struct {
RedisClient *redis.Client // Redis клиент
MaxRequests int // Максимальное количество запросов
Duration time.Duration // Период для подсчета запросов
}
```## Поддерживаемые заголовки
Middleware автоматически определяет реальный IP клиента из следующих заголовков:
1. `CF-Connecting-IP` - Cloudflare
2. `X-Forwarded-For` - стандартный заголовок proxy## Обработка ошибок
- При ошибках Redis middleware продолжает работу (fail-open)
- При превышении лимита возвращается HTTP 429 (Too Many Requests)
- При невозможности определить IP адрес запрос пропускается## Требования
- Go 1.21+
- Redis сервер
- `github.com/redis/go-redis/v9`## Лицензия
MIT License - смотрите файл [LICENSE](LICENSE) для подробностей.