// ipratelimiter 包示例:按 IP 维度的令牌桶限流器 package main import ( "fmt" "time" "git.zeroonesoft.cn/golib/zogo/ipratelimiter" "golang.org/x/time/rate" ) func main() { // 每秒补充 2 个令牌,桶容量 3 limiter := ipratelimiter.NewIPRateLimiter(rate.Limit(2), 3) ip := "192.168.1.100" allowed := 0 for i := 0; i < 10; i++ { // GetLimiter:该 IP 不存在时自动创建 l := limiter.GetLimiter(ip) if l.Allow() { allowed++ fmt.Printf("第 %2d 次请求: 放行\n", i+1) } else { fmt.Printf("第 %2d 次请求: 拒绝\n", i+1) } time.Sleep(50 * time.Millisecond) } fmt.Printf("共放行 %d 次\n", allowed) // 不同 IP 相互独立限流 fmt.Println("另一 IP 首次请求放行:", limiter.GetLimiter("10.0.0.1").Allow()) }