Ir al contenido

Rate Limiter

RateLimiter proporciona un middleware de rate limiter que limita el número de requests enviados al servidor desde una IP o identificador particular dentro de un periodo.

Por defecto, un store en memoria lleva la cuenta de los requests. La implementación en memoria por defecto se centra en la corrección y puede no ser la mejor opción para un número alto de requests concurrentes o una gran cantidad de identificadores distintos (>16k).

Todo el middleware principal reside en el paquete middleware:

import "github.com/labstack/echo/v5/middleware"

Para agregar un rate limit a tu aplicación, agrega el middleware RateLimiter. El ejemplo siguiente limita la aplicación a 20 requests/sec usando el store en memoria por defecto:

e.Use(middleware.RateLimiter(middleware.NewRateLimiterMemoryStore(20.0)))
config := middleware.RateLimiterConfig{
Skipper: middleware.DefaultSkipper,
Store: middleware.NewRateLimiterMemoryStoreWithConfig(
middleware.RateLimiterMemoryStoreConfig{Rate: 10, Burst: 30, ExpiresIn: 3 * time.Minute},
),
IdentifierExtractor: func(c *echo.Context) (string, error) {
id := c.RealIP()
return id, nil
},
ErrorHandler: func(c *echo.Context, err error) error {
return c.JSON(http.StatusForbidden, nil)
},
DenyHandler: func(c *echo.Context, identifier string, err error) error {
return c.JSON(http.StatusTooManyRequests, nil)
},
}
e.Use(middleware.RateLimiterWithConfig(config))
var (
// ErrRateLimitExceeded denotes an error raised when the rate limit is exceeded.
ErrRateLimitExceeded = echo.NewHTTPError(http.StatusTooManyRequests, "rate limit exceeded")
// ErrExtractorError denotes an error raised when the extractor function is unsuccessful.
ErrExtractorError = echo.NewHTTPError(http.StatusForbidden, "error while extracting identifier")
)

RateLimiterConfig · github.com/labstack/echo/[email protected]

Las descripciones de los campos se generan a partir de comentarios del código fuente en inglés.

Campos del código fuente
CampoTipoDescripciónFuente
SkipperSkipperSee the type documentation.L39
BeforeFuncBeforeFuncSee the type documentation.L40
IdentifierExtractorExtractorIdentifierExtractor uses *echo.Context to extract the identifier for a visitorL42
StoreRateLimiterStoreStore defines a store for the rate limiterL44
ErrorHandlerfunc(c *echo.Context, err error) errorErrorHandler provides a handler to be called when IdentifierExtractor returns an errorL46
DenyHandlerfunc(c *echo.Context, identifier string, err error) errorDenyHandler provides a handler to be called when RateLimiter denies accessL48
Funciones del código fuente
TipoFuente
func RateLimiter(store RateLimiterStore) echo.MiddlewareFuncL86
func RateLimiterWithConfig(config RateLimiterConfig) echo.MiddlewareFuncL119

RateLimiterMemoryStoreConfig · github.com/labstack/echo/[email protected]

Las descripciones de los campos se generan a partir de comentarios del código fuente en inglés.

Campos del código fuente
CampoTipoDescripciónFuente
Ratefloat64See the type documentation.L245
BurstintSee the type documentation.L246
ExpiresIntime.DurationSee the type documentation.L247
Funciones del código fuente
TipoFuente
func NewRateLimiterMemoryStore(rateLimit float64) (store *RateLimiterMemoryStore)L200
func NewRateLimiterMemoryStoreWithConfig(config RateLimiterMemoryStoreConfig) (store *RateLimiterMemoryStore)L225
// DefaultRateLimiterConfig defines default values for RateLimiterConfig.
var DefaultRateLimiterConfig = RateLimiterConfig{
Skipper: DefaultSkipper,
IdentifierExtractor: func(c *echo.Context) (string, error) {
id := c.RealIP()
return id, nil
},
ErrorHandler: func(c *echo.Context, err error) error {
return &echo.HTTPError{
Code: ErrExtractorError.Code,
Message: ErrExtractorError.Message,
Internal: err,
}
},
DenyHandler: func(c *echo.Context, identifier string, err error) error {
return &echo.HTTPError{
Code: ErrRateLimitExceeded.Code,
Message: ErrRateLimitExceeded.Message,
Internal: err,
}
},
}