From 02b9d6e3809535f10f02d11fe2bbe65a7e5c4889 Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 27 Oct 2018 16:13:31 +0800 Subject: [PATCH] - use millisecond for limit access speed --- platformapi/ebaiapi/access_limit.go | 32 ++++++++++++++++++-------- platformapi/ebaiapi/ebaiapi.go | 1 + platformapi/limit_access_speed.go | 8 +++---- platformapi/limit_access_speed_test.go | 12 +++++----- utils/typeconv.go | 2 +- 5 files changed, 34 insertions(+), 21 deletions(-) diff --git a/platformapi/ebaiapi/access_limit.go b/platformapi/ebaiapi/access_limit.go index bee5c991..31c5915d 100644 --- a/platformapi/ebaiapi/access_limit.go +++ b/platformapi/ebaiapi/access_limit.go @@ -2,28 +2,40 @@ package ebaiapi import "git.rosy.net.cn/baseapi/platformapi" +const ( + allAPI = "all" +) + var ( apiLimitConfigs = map[string]*platformapi.LimiterConfig{ + allAPI: &platformapi.LimiterConfig{ + MaxAccessCount: 5, + TimeGapMilliSecond: 1000, + }, "sku.create": &platformapi.LimiterConfig{ - MaxAccessCount: 5 - 1, - TimeGapInSecond: 1, + MaxAccessCount: 5 - 1, + TimeGapMilliSecond: 1000, }, "sku.delete": &platformapi.LimiterConfig{ - MaxAccessCount: 1, - TimeGapInSecond: 1, + MaxAccessCount: 1, + TimeGapMilliSecond: 2000, }, "sku.shop.category.delete": &platformapi.LimiterConfig{ - MaxAccessCount: 5 - 2, - TimeGapInSecond: 1, + MaxAccessCount: 1, + TimeGapMilliSecond: 1000, }, "sku.shop.category.create": &platformapi.LimiterConfig{ - MaxAccessCount: 5 - 1, - TimeGapInSecond: 1, + MaxAccessCount: 2, + TimeGapMilliSecond: 1000, + }, + "sku.list": &platformapi.LimiterConfig{ + MaxAccessCount: 5 - 3, + TimeGapMilliSecond: 1000, }, } defaultAPILimitConfig = &platformapi.LimiterConfig{ - MaxAccessCount: 5 - 2, - TimeGapInSecond: 1, + MaxAccessCount: 5 - 2, + TimeGapMilliSecond: 1000, } ) diff --git a/platformapi/ebaiapi/ebaiapi.go b/platformapi/ebaiapi/ebaiapi.go index 9c86fba1..ddd1a6f2 100644 --- a/platformapi/ebaiapi/ebaiapi.go +++ b/platformapi/ebaiapi/ebaiapi.go @@ -72,6 +72,7 @@ func (a *API) signParams(params url.Values) string { } func (a *API) AccessAPI(cmd string, body map[string]interface{}) (retVal *ResponseResult, err error) { + // a.speedLimiter.AccessAPI(allAPI) a.speedLimiter.AccessAPI(cmd) if body == nil { body = make(map[string]interface{}, 0) diff --git a/platformapi/limit_access_speed.go b/platformapi/limit_access_speed.go index ea8a335f..08b45416 100644 --- a/platformapi/limit_access_speed.go +++ b/platformapi/limit_access_speed.go @@ -8,8 +8,8 @@ import ( ) type LimiterConfig struct { - MaxAccessCount int - TimeGapInSecond int + MaxAccessCount int + TimeGapMilliSecond int } type Limiter struct { @@ -23,7 +23,7 @@ func New(config map[string]*LimiterConfig, defaultConfig ...*LimiterConfig) *Lim 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)) + limiter.limitConfig[k] = ratelimit.NewBucketWithQuantum(time.Duration(v.TimeGapMilliSecond)*time.Millisecond, int64(v.MaxAccessCount), int64(v.MaxAccessCount)) } if len(defaultConfig) > 0 { limiter.defaultConfig = defaultConfig[0] @@ -40,7 +40,7 @@ func (l *Limiter) AccessAPI(apiName string) { 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)) + bucket = ratelimit.NewBucketWithQuantum(time.Duration(v.TimeGapMilliSecond)*time.Millisecond, int64(v.MaxAccessCount), int64(v.MaxAccessCount)) l.limitConfig[apiName] = bucket } l.Unlock() diff --git a/platformapi/limit_access_speed_test.go b/platformapi/limit_access_speed_test.go index f34060d2..1f6bf882 100644 --- a/platformapi/limit_access_speed_test.go +++ b/platformapi/limit_access_speed_test.go @@ -11,16 +11,16 @@ import ( func TestLimitSpeed(t *testing.T) { limiter := New(map[string]*LimiterConfig{ "limited1persecond": &LimiterConfig{ - MaxAccessCount: 1, - TimeGapInSecond: 1, + MaxAccessCount: 1, + TimeGapMilliSecond: 1000, }, "limited10per10second": &LimiterConfig{ - MaxAccessCount: 10, - TimeGapInSecond: 10, + MaxAccessCount: 10, + TimeGapMilliSecond: 10 * 1000, }, }, &LimiterConfig{ - MaxAccessCount: 1, - TimeGapInSecond: 2, + MaxAccessCount: 1, + TimeGapMilliSecond: 2000, }) go func() { diff --git a/utils/typeconv.go b/utils/typeconv.go index 3dad529d..70447a3d 100644 --- a/utils/typeconv.go +++ b/utils/typeconv.go @@ -43,7 +43,7 @@ func UnmarshalUseNumber(data []byte, result interface{}) error { func MustMarshal(obj interface{}) []byte { byteArr, err := json.Marshal(obj) if err != nil { - panic(fmt.Sprintf("err when Marshal obj:%v", obj)) + panic(fmt.Sprintf("err when Marshal obj:%v with error:%v", obj, err)) } return byteArr }