feat(login): 引入基于 IP 的限流中间件
新增 github.com/xiaoqidun/limit 依赖,替换原有的全局速率限制器, 实现针对客户端 IP 的细粒度限流控制。在服务启动时初始化限流器, 并在程序退出前确保后台任务正确停止。同时更新 go.work 和 login/go.sum 文件以包含新的依赖项。此外,在 logic/main.go 中添加了主玩家数据 保存逻辑以确保服务关闭时数据持久化。
This commit is contained in:
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user