- default config support for limt_access_speed.

* fix bug when request.Body is nil.
This commit is contained in:
gazebo
2018-10-27 12:29:27 +08:00
parent ecb04fbe72
commit 6a5afbb07f
5 changed files with 41 additions and 5 deletions

View File

@@ -1,6 +1,7 @@
package platformapi
import (
"sync"
"time"
"github.com/juju/ratelimit"
@@ -12,21 +13,38 @@ type LimiterConfig struct {
}
type Limiter struct {
limitConfig map[string]*ratelimit.Bucket
limitConfig map[string]*ratelimit.Bucket
defaultConfig *LimiterConfig
sync.RWMutex
}
func New(config map[string]*LimiterConfig) *Limiter {
func New(config map[string]*LimiterConfig, defaultConfig ...*LimiterConfig) *Limiter {
limiter := &Limiter{
limitConfig: make(map[string]*ratelimit.Bucket),
}
for k, v := range config {
limiter.limitConfig[k] = ratelimit.NewBucketWithQuantum(time.Duration(v.TimeGapInSecond)*time.Second, int64(v.MaxAccessCount), int64(v.MaxAccessCount))
}
if len(defaultConfig) > 0 {
limiter.defaultConfig = defaultConfig[0]
}
return limiter
}
func (l *Limiter) AccessAPI(apiName string) {
l.RLock()
bucket := l.limitConfig[apiName]
l.RUnlock()
if bucket == nil && l.defaultConfig != nil {
l.Lock()
if bucket = l.limitConfig[apiName]; bucket == nil {
v := l.defaultConfig
bucket = ratelimit.NewBucketWithQuantum(time.Duration(v.TimeGapInSecond)*time.Second, int64(v.MaxAccessCount), int64(v.MaxAccessCount))
l.limitConfig[apiName] = bucket
}
l.Unlock()
}
if bucket != nil {
bucket.Wait(1)
}