Go 언어 및 Redis를 사용하여 API 전류 제한을 구현하는 방법
개요:
인터넷의 급속한 발전과 함께 API 인터페이스의 사용도 증가하고 있으며 일부 API 인터페이스는 너무 많은 요청으로 인해 시스템 오류가 발생할 수 있습니다. .부하가 너무 높거나 마비되기도 합니다. 시스템의 안정성과 신뢰성을 보장하려면 API 인터페이스의 현재 흐름을 제한해야 합니다. 이 기사에서는 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。main.go
文件,使用命令行进入文件所在目录,执行go run main.go
checkAPIRequest
함수는 API 요청이 허용되는지 확인하는 데 사용됩니다. 각 요청마다 client.Decr("bucket")
작업을 통해 토큰 버킷에서 토큰을 꺼냅니다. 토큰 수가 0보다 작으면 요청을 할 수 없다는 뜻입니다. 토큰을 요청해야 합니다. 버킷에 토큰을 추가하고 false를 반환합니다. 토큰 수가 0보다 크거나 같으면 요청이 허용되고 true가 반환됩니다. 코드 실행
위 코드를 main.go
파일로 저장하고 명령줄을 사용하여 파일이 있는 디렉터리를 입력한 다음 go run main.go
를 실행하여 코드를 실행하세요. 프로그램은 각 요청 사이에 100밀리초 간격으로 100개의 요청을 시뮬레이션합니다. 설정된 최대 요청 수에 따라 처음 100개의 요청을 허용하고 이후 요청은 거부해야 합니다.
위 내용은 Go 언어 및 Redis를 사용하여 API 현재 제한을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!