feat(login): 引入基于 IP 的限流中间件

新增 github.com/xiaoqidun/limit 依赖,替换原有的全局速率限制器,
实现针对客户端 IP 的细粒度限流控制。在服务启动时初始化限流器,
并在程序退出前确保后台任务正确停止。同时更新 go.work 和 login/go.sum
文件以包含新的依赖项。此外,在 logic/main.go 中添加了主玩家数据
保存逻辑以确保服务关闭时数据持久化。
This commit is contained in:
2025-10-24 23:14:36 +08:00
parent 749b380d82
commit db3a21dd91
13 changed files with 726 additions and 5 deletions

View File

@@ -12,11 +12,13 @@ import (
"github.com/gogf/gf/v2/net/ghttp"
"github.com/gogf/gf/v2/os/gcmd"
"github.com/gogf/gf/v2/os/gfile"
"github.com/xiaoqidun/limit"
"golang.org/x/time/rate"
)
var (
Main = gcmd.Command{
limiter = limit.New()
Main = gcmd.Command{
Name: "main",
Usage: "main",
Brief: "start http server",
@@ -25,7 +27,10 @@ var (
if cool.IsRedisMode {
go cool.ListenFunc(ctx)
}
// 1. 创建一个新的 Limiter 实例
// 2. 确保在程序退出前优雅地停止后台任务,这非常重要
defer limiter.Stop()
s := g.Server()
s.Use(Limiter, ghttp.MiddlewareHandlerResponse)
s.EnableAdmin()
@@ -52,12 +57,12 @@ func beforeServeHook(r *ghttp.Request) {
r.Response.CORSDefault()
}
var limiter = rate.NewLimiter(rate.Limit(10), 1)
// Limiter is a middleware that implements rate limiting for all HTTP requests.
// It returns HTTP 429 (Too Many Requests) when the rate limit is exceeded.
func Limiter(r *ghttp.Request) {
if !limiter.Allow() {
rateLimiter := limiter.Get(r.GetClientIp(), rate.Limit(10), 2)
if !rateLimiter.Allow() {
r.Response.WriteStatusExit(429) // Return 429 Too Many Requests
r.ExitAll()
}