Iris용 요청 속도 제한 미들웨어

Susan Sarandon
풀어 주다: 2024-10-31 11:58:02
원래의
937명이 탐색했습니다.

Request Rate Limiting Middleware for Iris

개요

속도 미들웨어는 Iris 웹 프레임워크에 속도 제한 기능을 제공합니다. 이를 통해 개발자는 애플리케이션에 대한 요청 비율을 제어하여 공정한 사용을 보장하고 남용을 방지할 수 있습니다. 미들웨어는 속도 제한에 널리 사용되는 방법인 토큰 버킷 알고리즘을 기반으로 합니다.

설치

rate 미들웨어를 사용하려면 Iris 애플리케이션에서 이를 가져와야 합니다.

import "github.com/kataras/iris/v12/middleware/rate"
로그인 후 복사

용법

기본 설정

Rate Limiter를 사용하려면 Iris 애플리케이션을 만들고 미들웨어를 등록해야 합니다. 다음은 속도 제한기를 설정하는 방법의 예입니다.

package main

import (
    "time"

    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/rate"
)

func main() {
    app := iris.New()
    app.Logger().SetLevel("debug")

    limit := rate.Limit(1, 5, rate.PurgeEvery(time.Minute, 5*time.Minute))
    app.Use(limit)

    app.Get("/", index)
    app.Get("/other", other)

    app.Listen(":8080")
}

func index(ctx iris.Context) {
    ctx.HTML("<h1>Index Page</h1>")
}

func other(ctx iris.Context) {
    ctx.HTML("<h1>Other Page</h1>")
}
로그인 후 복사

이 예에서는 최대 버스트 크기가 5인 초당 1개의 요청을 허용합니다. 또한 5분 동안 표시되지 않은 오래된 항목은 1분마다 삭제됩니다.

rate.Every Helper 사용

이 예는 비율을 사용하는 방법을 보여줍니다. 모든 도우미는 비율 제한기를 설정합니다.

package main

import (
    "time"

    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/rate"
)

func main() {
    app := iris.New()
    app.Logger().SetLevel("debug")

    // Use rate.Every helper to set up the rate limiter.
    limit := rate.Limit(rate.Every(time.Minute), 5)
    app.Use(limit)

    app.Get("/", index)
    app.Get("/other", other)

    app.Listen(":8080")
}

func index(ctx iris.Context) {
    ctx.HTML("<h1>Index Page</h1>")
}

func other(ctx iris.Context) {
    ctx.HTML("<h1>Other Page</h1>")
}
로그인 후 복사

속도 제한을 위해 API 키 사용

이 예에서는 클라이언트의 원격 IP 주소 대신 API 키를 사용하는 속도 제한기를 설정하는 방법을 보여줍니다.

package main

import (
    "time"

    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/rate"
)

func main() {
    app := iris.New()
    app.Logger().SetLevel("debug")

    // Use API key for rate limiting.
    app.Use(useAPIKey)

    limit := rate.Limit(rate.Every(time.Minute), 300, rate.PurgeEvery(5*time.Minute, 15*time.Minute))
    app.Use(limit)

    app.Get("/list", list)

    app.Listen(":8080")
}

func useAPIKey(ctx iris.Context) {
    apiKey := ctx.Header("X-API-Key")
    if apiKey == "" {
        ctx.StopWithStatus(iris.StatusForbidden)
        return
    }

    rate.SetIdentifier(ctx, apiKey)
    ctx.Next()
}

func list(ctx iris.Context) {
    ctx.JSON(iris.Map{"key": "value"})
}
로그인 후 복사

사용자 정의 초과 처리기

이 예에서는 비율 제한이 초과될 때 실행될 사용자 정의 핸들러를 설정하는 방법을 보여줍니다.

package main

import (
    "time"

    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/rate"
)

func main() {
    app := iris.New()
    app.Logger().SetLevel("debug")

    // Set a custom exceed handler.
    limit := rate.Limit(1, 5, rate.ExceedHandler(func(ctx iris.Context) {
        ctx.StopWithStatus(429)
    }))
    app.Use(limit)

    app.Get("/", index)
    app.Get("/other", other)

    app.Listen(":8080")
}

func index(ctx iris.Context) {
    ctx.HTML("<h1>Index Page</h1>")
}

func other(ctx iris.Context) {
    ctx.HTML("<h1>Other Page</h1>")
}
로그인 후 복사

맞춤형 클라이언트 데이터

이 예에서는 각 클라이언트에 대한 사용자 정의 데이터를 저장하는 방법을 보여줍니다.

package main

import (
    "time"

    "github.com/kataras/iris/v12"
    "github.com/kataras/iris/v12/middleware/rate"
)

func main() {
    app := iris.New()
    app.Logger().SetLevel("debug")

    // Store custom data for each client.
    limit := rate.Limit(1, 5, rate.ClientData(func(ctx iris.Context) any {
        return ctx.RemoteAddr()
    }))
    app.Use(limit)

    app.Get("/", index)
    app.Get("/other", other)

    app.Listen(":8080")
}

func index(ctx iris.Context) {
    ctx.HTML("<h1>Index Page</h1>")
}

func other(ctx iris.Context) {
    ctx.HTML("<h1>Other Page</h1>")
}
로그인 후 복사

설명

  • 속도 제한: rate.Limit 함수는 새로운 속도 제한기를 생성하는 데 사용됩니다. 세 가지 매개변수가 필요합니다:

    • 제한: 초당 허용되는 최대 요청 수입니다.
    • 버스트: 최대 버스트 크기입니다.
    • 옵션: 오래된 항목을 정리하기 위한 PurgeEvery와 같은 추가 옵션.
  • 토큰 버킷 알고리즘: 이 알고리즘은 토큰 버킷을 유지하여 요청 속도를 제어합니다. 각 요청은 토큰을 소비하며 토큰은 고정된 속도로 버킷에 추가됩니다. 버킷이 비어 있으면 요청이 거부됩니다.

토큰 버킷 알고리즘

토큰 버킷 알고리즘은 요청 비율을 제어하는 ​​간단하고 효율적인 방법입니다. 다음과 같이 작동합니다:

  1. 초기화: 버킷은 특정 수의 토큰으로 초기화됩니다.
  2. 토큰 추가: 토큰은 고정된 비율로 버킷에 추가됩니다.
  3. 요청 처리: 각 요청은 토큰을 소비합니다. 버킷이 비어 있으면 요청이 거부됩니다.
  4. 버스트 처리: 버킷은 최대 수의 토큰을 보유할 수 있으므로 트래픽 버스트가 가능합니다.

자세한 내용은 토큰 버킷에 대한 위키피디아 글을 참고하세요.

결론

이 미들웨어는 Iris 애플리케이션에서 속도 제한을 구현하는 강력하고 유연한 방법을 제공합니다. 토큰 버킷 알고리즘을 사용하면 공정한 사용을 보장하고 남용을 방지하여 애플리케이션을 더욱 안정적이고 안전하게 만들 수 있습니다.

더 많은 예시와 자세한 사용법은 Iris 공식 문서를 참고하세요.

위 내용은 Iris용 요청 속도 제한 미들웨어의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!