zoukankan      html  css  js  c++  java
  • beego 限速

    beego 限速

    路由之前调用

    import "github.com/ulule/limiter/v3"
    import "github.com/ulule/limiter/v3/drivers/store/memory"
    
    
    type rateLimiter struct {
    	generalLimiter *limiter.Limiter
    	loginLimiter   *limiter.Limiter
    }
    
    func main(){
    	r := &rateLimiter{}
    
    	rate, err := limiter.NewRateFromFormatted("5-S")
    	PanicOnError(err)
    	r.generalLimiter = limiter.New(memory.NewStore(), rate)
    
    	loginRate, err := limiter.NewRateFromFormatted("5-M")
    	PanicOnError(err)
    	r.loginLimiter = limiter.New(memory.NewStore(), loginRate)
    
    	//More on Beego filters here https://beego.me/docs/mvc/controller/filter.md
    	beego.InsertFilter("/*", beego.BeforeRouter, func(c *context.Context) {
    		rateLimit(r, c)
    	}, true)
    	
    	beego.Run()
    }
    
    

    具体实现

    func rateLimit(r *rateLimiter, ctx *context.Context) {
    	var (
    		limiterCtx limiter.Context
    		ip         net.IP
    		err        error
    		req        = ctx.Request
    	)
    
    	if strings.HasPrefix(ctx.Input.URL(), "/v1/user/login") {
    		ip = r.loginLimiter.GetIP(req)
    		limiterCtx, err = r.loginLimiter.Get(req.Context(), ip.String())
    	} else {
    		ip = r.generalLimiter.GetIP(req)
    		limiterCtx, err = r.generalLimiter.Get(req.Context(), ip.String())
    	}
    	if err != nil {
    		PanicOnError(err)
    	}
    	h := ctx.ResponseWriter.Header()
    	h.Add("X-RateLimit-Limit", strconv.FormatInt(limiterCtx.Limit, 10))
    	h.Add("X-RateLimit-Remaining", strconv.FormatInt(limiterCtx.Remaining, 10))
    	h.Add("X-RateLimit-Reset", strconv.FormatInt(limiterCtx.Reset, 10))
    
    	if limiterCtx.Reached {
    		fmt.Println("Too Many Requests from %s on %s", ip, ctx.Input.URL())
    		ctx.Output.SetStatus(429)
    		resBytes, err := json.Marshal(controllers.OutResponse(429, nil, ""))
    		if err != nil {
    			fmt.Println(err)
    		}
    		ctx.Output.Body(resBytes)
    		return
    	}
    
    }
    ``
  • 相关阅读:
    剑指offer[30]——连续子数组的最大和
    移动端数据爬取
    Scrapy框架基础应用和持久化存储
    爬虫的验证码处理,图片懒加载,selenium和 PhantomJS,requests模块的session,线程池
    爬虫之数据解析(bs4,Xpath)
    爬虫之jupyter的使用,requests模块,正则表达式
    git的分支,多人协作,标签管理
    git 的基础
    利用python操作excel表
    nginx基于uwsgi部署Django
  • 原文地址:https://www.cnblogs.com/tomtellyou/p/12915313.html
Copyright © 2011-2022 走看看