feat(ipratelimiter): 自 go-hua 迁入按 IP 令牌桶限流器并修正包子句
- 包子句 IPRateLimiter → ipratelimiter(符合 Go 小写命名惯例), 消费方 限定符同步; 新增依赖 golang.org/x/time - 附测试、examples/ipratelimiter 例程与包 README
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
// 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())
|
||||
}
|
||||
Reference in New Issue
Block a user