package limit import ( "github.com/gin-gonic/gin" "github.com/juju/ratelimit" "strings" "time" ) type UriLimiter struct { *Limiter Rule *LimitConfRules } func NewUriLimiter() LimiterIface { return &UriLimiter{ Limiter: &Limiter{ limiterBuckets: make(map[string]*ratelimit.Bucket), }, } } func (l *UriLimiter) Key(c *gin.Context) string { uri := c.Request.RequestURI index := strings.Index(uri, "?") if index == -1 { return uri } return uri[:index] } func (l *UriLimiter) GetBucket(key string) (*ratelimit.Bucket, bool) { //logger.AccessLogger.Infoln(key, l.limiterBuckets) bucket, ok := l.limiterBuckets[key] return bucket, ok } func (l *UriLimiter) AddBucketsByUri(uri string, fillInterval, capacity, quantum int64) LimiterIface { bucket := ratelimit.NewBucketWithQuantum(time.Second*time.Duration(fillInterval), capacity, quantum) l.limiterBuckets[uri] = bucket return l } // //func (l *UriLimiter) getConf() *LimitConfRules { // rule := &LimitConfRules{} // // rule.Rules = make(map[string]*LimitOpt) // // // 抢红包接口 // rule.Rules["/app/v1/red/rob"] = &LimitOpt{ // Interval: 1, // Capacity: 100, // 总共可以存多少个令牌 // Quantum: 60, // 每次 Interval 时间往桶里扔 多少个令牌 // } // // // 红包详情接口 // rule.Rules["/app/v1/red/info"] = &LimitOpt{ // Interval: 1, // Capacity: 100, // Quantum: 50, // } // // rule.Rules["/app/v1/sso/test"] = &LimitOpt{ // Interval: 1, // Capacity: 1, // Quantum: 1, // } // // return rule //} func (l *UriLimiter) AddBucketByConf(rules map[string]*LimitOpt) LimiterIface { //rule := l.getConf() for k, v := range rules { l.AddBucketsByUri(k, v.Interval, v.Capacity, v.Quantum) } return l }