>백엔드 개발 >Golang >Go 언어 및 Redis를 사용하여 API 현재 제한을 구현하는 방법

Go 언어 및 Redis를 사용하여 API 현재 제한을 구현하는 방법

WBOY
WBOY원래의
2023-10-26 09:27:28757검색

Go 언어 및 Redis를 사용하여 API 현재 제한을 구현하는 방법

Go 언어 및 Redis를 사용하여 API 전류 제한을 구현하는 방법

개요:
인터넷의 급속한 발전과 함께 API 인터페이스의 사용도 증가하고 있으며 일부 API 인터페이스는 너무 많은 요청으로 인해 시스템 오류가 발생할 수 있습니다. .부하가 너무 높거나 마비되기도 합니다. 시스템의 안정성과 신뢰성을 보장하려면 API 인터페이스의 현재 흐름을 제한해야 합니다. 이 기사에서는 Go 언어와 Redis를 사용하여 API 전류 제한 기능을 구현하는 방법을 소개하고 구체적인 코드 예제를 제공합니다.

  1. API 전류 제한의 원리
    API 전류 제한은 악의적인 요청이나 대량의 요청으로 인해 시스템이 과부하되는 것을 방지하기 위해 API 인터페이스에 대한 액세스를 제한하는 것을 의미합니다. 일반적인 API 전류 제한 알고리즘에는 카운터 알고리즘, 누출 버킷 알고리즘 및 토큰 버킷 알고리즘이 포함됩니다. 이 문서에서는 토큰 버킷 알고리즘이 사용됩니다. 그 원칙은 토큰 버킷을 통해 요청 흐름을 제어하는 ​​것입니다.
  2. 환경 준비
    시작하기 전에 Go 언어와 Redis가 설치되어 있고 해당 라이브러리를 가져왔는지 확인해야 합니다.
  3. 구현 코드
    다음은 Go 언어와 Redis를 사용하여 API 전류 제한을 구현하는 샘플 코드입니다.
package main

import (
    "fmt"
    "github.com/go-redis/redis"
    "time"
)

const (
    MaxReqPerSec = 100 // 每秒最大请求数
)

func main() {
    client := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // 如果有密码,填入密码
        DB:       0,  // 默认数据库
    })

    // 初始化令牌桶
    client.Set("bucket", MaxReqPerSec, 0)

    // 模拟请求
    for i := 0; i < 1000; i++ {
        if allowed, err := checkAPIRequest(client); allowed {
            // 执行API请求
            fmt.Println("API request allowed")
            // ....
        } else {
            fmt.Println("API request denied")
            // ....
        }
        time.Sleep(time.Millisecond * 100)
    }
}

func checkAPIRequest(client *redis.Client) (bool, error) {
    val, err := client.Decr("bucket").Result()
    if err != nil {
        return false, err
    }

    if val < 0 {
        client.Incr("bucket")
        return false, nil
    }

    return true, nil
}

코드 설명:

  • main 함수에서 먼저 연결을 설정합니다. Redis를 사용하여 토큰 버킷을 초기화하고 초당 최대 요청 수를 100으로 설정했습니다. main函数中,我们首先建立与Redis的连接,并初始化了一个令牌桶,设置每秒最大请求数量为100。
  • checkAPIRequest函数用于检查是否允许进行API请求。在每次请求时,我们通过client.Decr("bucket")操作从令牌桶中取出一个令牌,如果令牌数量小于0,则表示不能进行请求,需要向令牌桶中添加令牌,并返回false。如果令牌数量大于等于0,则表示允许进行请求,并返回true。
  1. 运行代码
    保存以上代码为main.go文件,使用命令行进入文件所在目录,执行go run main.go
  2. checkAPIRequest 함수는 API 요청이 허용되는지 확인하는 데 사용됩니다. 각 요청마다 client.Decr("bucket") 작업을 통해 토큰 버킷에서 토큰을 꺼냅니다. 토큰 수가 0보다 작으면 요청을 할 수 없다는 뜻입니다. 토큰을 요청해야 합니다. 버킷에 토큰을 추가하고 false를 반환합니다. 토큰 수가 0보다 크거나 같으면 요청이 허용되고 true가 반환됩니다.

    코드 실행
    위 코드를 main.go 파일로 저장하고 명령줄을 사용하여 파일이 있는 디렉터리를 입력한 다음 go run main.go 를 실행하여 코드를 실행하세요. 프로그램은 각 요청 사이에 100밀리초 간격으로 100개의 요청을 시뮬레이션합니다. 설정된 최대 요청 수에 따라 처음 100개의 요청을 허용하고 이후 요청은 거부해야 합니다.

    🎜🎜요약: 🎜이 글에서는 Go 언어와 Redis를 사용하여 API 전류 제한 기능을 구현하고 토큰 버킷 알고리즘을 통해 요청 흐름을 제어하는 ​​방법을 소개합니다. 이 방법을 사용하면 대량의 요청으로 인해 시스템이 과부하되지 않도록 효과적으로 보호하고 시스템의 안정성과 가용성을 향상시킬 수 있습니다. 🎜

위 내용은 Go 언어 및 Redis를 사용하여 API 현재 제한을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.