// Package ipratelimiter 提供按 IP 维度管理的令牌桶限流器。 package ipratelimiter import ( "sync" "golang.org/x/time/rate" ) // IPRateLimiter 按 IP 维度管理的令牌桶限流器 type IPRateLimiter struct { ips map[string]*rate.Limiter mu *sync.RWMutex r rate.Limit b int } // NewIPRateLimiter 创建限流器 // r 为每秒令牌补充速率,b 为桶容量 func NewIPRateLimiter(r rate.Limit, b int) *IPRateLimiter { i := &IPRateLimiter{ ips: make(map[string]*rate.Limiter), mu: &sync.RWMutex{}, r: r, b: b, } return i } // AddIP 为指定 IP 创建新的限流器并加入缓存 func (i *IPRateLimiter) AddIP(ip string) *rate.Limiter { i.mu.Lock() defer i.mu.Unlock() limiter := rate.NewLimiter(i.r, i.b) i.ips[ip] = limiter return limiter } // GetLimiter 返回指定 IP 的限流器,不存在时自动创建 func (i *IPRateLimiter) GetLimiter(ip string) *rate.Limiter { i.mu.Lock() limiter, exists := i.ips[ip] if !exists { i.mu.Unlock() return i.AddIP(ip) } i.mu.Unlock() return limiter }