支持基于redis的流量控制 #1
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@ -19,3 +19,4 @@
 | 
			
		||||
.idea
 | 
			
		||||
.vscode
 | 
			
		||||
mail_test.go
 | 
			
		||||
*_test.go
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								go.mod
									
									
									
									
									
								
							@ -26,6 +26,7 @@ require (
 | 
			
		||||
	github.com/go-playground/locales v0.14.1 // indirect
 | 
			
		||||
	github.com/go-playground/universal-translator v0.18.1 // indirect
 | 
			
		||||
	github.com/go-playground/validator/v10 v10.11.2 // indirect
 | 
			
		||||
	github.com/go-redis/redis_rate/v9 v9.1.2 // indirect
 | 
			
		||||
	github.com/goccy/go-json v0.10.0 // indirect
 | 
			
		||||
	github.com/json-iterator/go v1.1.12 // indirect
 | 
			
		||||
	github.com/leodido/go-urn v1.2.1 // indirect
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.sum
									
									
									
									
									
								
							@ -66,6 +66,8 @@ github.com/go-playground/validator/v10 v10.11.2 h1:q3SHpufmypg+erIExEKUmsgmhDTyh
 | 
			
		||||
github.com/go-playground/validator/v10 v10.11.2/go.mod h1:NieE624vt4SCTJtD87arVLvdmjPAeV8BQlHtMnw9D7s=
 | 
			
		||||
github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
 | 
			
		||||
github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
 | 
			
		||||
github.com/go-redis/redis_rate/v9 v9.1.2 h1:H0l5VzoAtOE6ydd38j8MCq3ABlGLnvvbA1xDSVVCHgQ=
 | 
			
		||||
github.com/go-redis/redis_rate/v9 v9.1.2/go.mod h1:oam2de2apSgRG8aJzwJddXbNu91Iyz1m8IKJE2vpvlQ=
 | 
			
		||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
 | 
			
		||||
github.com/goccy/go-json v0.9.7 h1:IcB+Aqpx/iMHu5Yooh7jEzJk1JZ7Pjtmys2ukPr7EeM=
 | 
			
		||||
github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										86
									
								
								rate_limit/limit.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								rate_limit/limit.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,86 @@
 | 
			
		||||
// Package rate_limit ...
 | 
			
		||||
//
 | 
			
		||||
// Description : rate_limit ...
 | 
			
		||||
//
 | 
			
		||||
// Author : go_developer@163.com<白茶清欢>
 | 
			
		||||
//
 | 
			
		||||
// Date : 2023-03-09 11:31
 | 
			
		||||
package rate_limit
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	redisInstance "github.com/go-redis/redis/v8"
 | 
			
		||||
	"github.com/go-redis/redis_rate/v9"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	// limiter 限流实例
 | 
			
		||||
	limiter *redis_rate.Limiter
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// InitLimiter 初始化限流器实例
 | 
			
		||||
//
 | 
			
		||||
// Author : go_developer@163.com<白茶清欢>
 | 
			
		||||
//
 | 
			
		||||
// Date : 11:40 2023/3/9
 | 
			
		||||
func InitLimiter(redisClient *redisInstance.Client) {
 | 
			
		||||
	limiter = redis_rate.NewLimiter(redisClient)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Second 每秒允许的访问数
 | 
			
		||||
//
 | 
			
		||||
// Author : go_developer@163.com<白茶清欢>
 | 
			
		||||
//
 | 
			
		||||
// Date : 11:42 2023/3/9
 | 
			
		||||
func Second(ctx context.Context, key string, total, rate int) bool {
 | 
			
		||||
	res, err := limiter.AllowN(ctx, key, redis_rate.PerSecond(total), rate)
 | 
			
		||||
	if nil != err {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return res.Allowed > 0
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Minute 每分钟允许访问数
 | 
			
		||||
//
 | 
			
		||||
// Author : go_developer@163.com<白茶清欢>
 | 
			
		||||
//
 | 
			
		||||
// Date : 11:46 2023/3/9
 | 
			
		||||
func Minute(ctx context.Context, key string, total, rate int) (bool, error) {
 | 
			
		||||
	res, err := limiter.AllowN(ctx, key, redis_rate.PerMinute(total), rate)
 | 
			
		||||
	if nil != err {
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
	return res.Allowed > 0, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Hour 每小时允许访问数
 | 
			
		||||
//
 | 
			
		||||
// Author : go_developer@163.com<白茶清欢>
 | 
			
		||||
//
 | 
			
		||||
// Date : 11:47 2023/3/9
 | 
			
		||||
func Hour(ctx context.Context, key string, total, rate int) (bool, error) {
 | 
			
		||||
	res, err := limiter.AllowN(ctx, key, redis_rate.PerHour(total), rate)
 | 
			
		||||
	if nil != err {
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
	return res.Allowed > 0, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Day 每天允许访问数
 | 
			
		||||
//
 | 
			
		||||
// Author : go_developer@163.com<白茶清欢>
 | 
			
		||||
//
 | 
			
		||||
// Date : 11:47 2023/3/9
 | 
			
		||||
func Day(ctx context.Context, key string, total, rate int) (bool, error) {
 | 
			
		||||
	res, err := limiter.AllowN(ctx, key, redis_rate.Limit{
 | 
			
		||||
		Rate:   rate,
 | 
			
		||||
		Period: 24 * time.Hour,
 | 
			
		||||
		Burst:  total,
 | 
			
		||||
	}, rate)
 | 
			
		||||
	if nil != err {
 | 
			
		||||
		return false, err
 | 
			
		||||
	}
 | 
			
		||||
	return res.Allowed > 0, nil
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user