新增 github.com/xiaoqidun/limit 依赖,替换原有的全局速率限制器, 实现针对客户端 IP 的细粒度限流控制。在服务启动时初始化限流器, 并在程序退出前确保后台任务正确停止。同时更新 go.work 和 login/go.sum 文件以包含新的依赖项。此外,在 logic/main.go 中添加了主玩家数据 保存逻辑以确保服务关闭时数据持久化。
42 lines
1.2 KiB
Go
42 lines
1.2 KiB
Go
# limit [](https://pkg.go.dev/github.com/xiaoqidun/limit)
|
||
一个高性能、并发安全的 Go 语言动态速率限制器
|
||
|
||
# 安装指南
|
||
```shell
|
||
go get -u github.com/xiaoqidun/limit
|
||
```
|
||
|
||
# 快速开始
|
||
```go
|
||
package main
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
"github.com/xiaoqidun/limit"
|
||
"golang.org/x/time/rate"
|
||
)
|
||
|
||
func main() {
|
||
// 1. 创建一个新的 Limiter 实例
|
||
limiter := limit.New()
|
||
// 2. 确保在程序退出前优雅地停止后台任务,这非常重要
|
||
defer limiter.Stop()
|
||
// 3. 为任意键 "some-key" 获取一个速率限制器
|
||
// - rate.Limit(2): 表示速率为 "每秒2个请求"
|
||
// - 2: 表示桶的容量 (Burst),允许瞬时处理2个请求
|
||
rateLimiter := limiter.Get("some-key", rate.Limit(2), 2)
|
||
// 4. 模拟3次连续的突发请求
|
||
// 由于速率和容量都为2,只有前两次请求能立即成功
|
||
for i := 0; i < 3; i++ {
|
||
if rateLimiter.Allow() {
|
||
fmt.Printf("请求 %d: 已允许\n", i+1)
|
||
} else {
|
||
fmt.Printf("请求 %d: 已拒绝\n", i+1)
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
# 授权协议
|
||
本项目使用 [Apache License 2.0](https://github.com/xiaoqidun/limit/blob/main/LICENSE) 授权协议 |