add rate limiter

This commit is contained in:
ginuerzh
2022-04-21 21:37:30 +08:00
parent a04c8b45f3
commit e23da0f319
8 changed files with 218 additions and 23 deletions

83
limiter/rate.go Normal file
View File

@ -0,0 +1,83 @@
package limiter
import (
"context"
"github.com/go-gost/core/limiter"
"golang.org/x/time/rate"
)
type llimiter struct {
limiter *rate.Limiter
}
func Limiter(r int) limiter.Limiter {
return &llimiter{
limiter: rate.NewLimiter(rate.Limit(r), r),
}
}
func (l *llimiter) Limit(b int) int {
if l.limiter.Burst() < b {
b = l.limiter.Burst()
}
l.limiter.WaitN(context.Background(), b)
return b
}
type Generator interface {
Generate() limiter.Limiter
}
type limiterGenerator struct {
limit int
}
func NewGenerator(r int) Generator {
return &limiterGenerator{limit: r}
}
// Generate creates a new Limiter.
func (g *limiterGenerator) Generate() limiter.Limiter {
return Limiter(g.limit)
}
type multiLimiter struct {
limiters []limiter.Limiter
}
func MultiLimiter(limiters ...limiter.Limiter) limiter.Limiter {
return &multiLimiter{
limiters: limiters,
}
}
func (l *multiLimiter) Limit(b int) int {
for i := range l.limiters {
b = l.limiters[i].Limit(b)
}
return b
}
type rateLimiter struct {
input limiter.Limiter
output limiter.Limiter
}
func RateLimiter(input, output limiter.Limiter) limiter.RateLimiter {
if input == nil || output == nil {
return nil
}
return &rateLimiter{
input: input,
output: output,
}
}
func (l *rateLimiter) Input() limiter.Limiter {
return l.input
}
func (l *rateLimiter) Output() limiter.Limiter {
return l.output
}