安装依赖: 确保你已经安装了 Beego 和 golang.org/x/time/rate 库。 sh 深色版本 go get github.com/beego/beego/v2 go get golang.org/x/time/rate 创建中间件目录: 创建一个中间件目录,并在其中编写限流逻辑。 集成中间件到 Beego 控制器: 在 Beego 控制器中使用这个中间件。 示例代码

  1. 安装依赖 sh 深色版本 go get github.com/beego/beego/v2 go get golang.org/x/time/rate
  2. 创建中间件目录 创建一个名为 middleware 的目录,并在其中创建一个名为 rate_limit.go 的文件。

// middleware/rate_limit.go

package middleware

import ( "net/http" "time"

"github.com/beego/beego/v2/core/filter"
"golang.org/x/time/rate"

)

type RateLimitMiddleware struct { limit *rate.Limiter }

func NewRateLimitMiddleware(max int, duration time.Duration) *RateLimitMiddleware { return &RateLimitMiddleware{ limit: rate.NewLimiter(rate.Every(duration), max), } }

func (m RateLimitMiddleware) Filter(next http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r http.Request) { if !m.limit.Allow() { http.Error(w, "Too many requests", http.StatusTooManyRequests) return } next(w, r) } }

func init() { filter.Register(NewRateLimitMiddleware(5, time.Second)) }

  1. 创建 Beego 控制器并使用中间件

深色版本 package main

import ( "github.com/beego/beego/v2/core/app" "github.com/beego/beego/v2/server/web" )

type MainController struct { web.Controller }

func (c *MainController) Get() { c.Data["json"] = map[string]string{"message": "Hello, World!"} c.ServeJSON() }

func main() { app.Run(&app.AppConfig{ Name: "beego-rate-limit", Enabled: true, })

beego.Router("/", &MainController{})

} 解释: 1、创建中间件 2、middleware/rate_limit.go: 3、RateLimitMiddleware 结构体包含一个 rate.Limiter 实例。 4、NewRateLimitMiddleware 函数用于创建一个新的限流器实例。 5、Filter 方法实现了中间件的核心逻辑,检查是否允许请求通过。 6、init 函数注册中间件。 7、Beego 控制器 MainController 是一个简单的控制器,处理 GET 请求。 Get 方法返回一个 JSON 响应。 启动 Beego 应用 使用 beego.Run 启动 Beego 应用,并配置路由。 运行示例 启动 Beego 应用: sh 深色版本 go run main.go 测试限流: 使用 curl 或其他工具连续发送多个请求到 / 路径,观察是否收到 429 状态码。 sh 深色版本 for i in {1..10}; do curl http://localhost:8080/; done 注意事项 限流器配置:可以根据需要调整限流器的配置,例如每分钟、每小时等。 错误处理:可以进一步优化错误处理逻辑,例如记录日志、重定向等。 中间件注册:确保中间件正确注册并在需要的地方应用。