- 包子句 IPRateLimiter → ipratelimiter(符合 Go 小写命名惯例), 消费方 限定符同步; 新增依赖 golang.org/x/time - 附测试、examples/ipratelimiter 例程与包 README
35 lines
792 B
Go
35 lines
792 B
Go
// 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())
|
|
}
|