Browse Source

Rename frequencyControl.go to frequency_control.go

Signed-off-by: SgitBusity <72297937+AllianceTing@users.noreply.github.com>
tags/v0.1.0
SgitBusity Xinwei Xiong 3 years ago
parent
commit
672e297888
1 changed files with 0 additions and 55 deletions
  1. +0
    -55
      server/internal/middleware/frequencyControl.go

+ 0
- 55
server/internal/middleware/frequencyControl.go View File

@@ -1,55 +0,0 @@
package middleware

import (
"sync"
"time"

"github.com/gin-gonic/gin"
)

// define rate limit struct
type frequencyControlByTokenBucket struct {
refreshRate float64 // 令牌的刷新速率
capacity int64 // 桶的容量
tokens float64 // 当前令牌数量
lastToken time.Time // 上一次放令牌的时间
mtx sync.Mutex // 互斥锁
}

// allow frequency
func (tb *frequencyControlByTokenBucket) Allow() bool {
tb.mtx.Lock()
defer tb.mtx.Unlock()
now := time.Now()
// compute tokens which needs
tb.tokens = tb.tokens + tb.refreshRate*now.Sub(tb.lastToken).Seconds()
if tb.tokens > float64(tb.capacity) {
tb.tokens = float64(tb.capacity)
}
// judge weather to pass through
if tb.tokens >= 1 {
tb.tokens--
tb.lastToken = now
return true
} else {
return false
}
}

// registried a middle ware
func LimitHandler(maxConn int, refreshRate float64) gin.HandlerFunc {
tb := &frequencyControlByTokenBucket{
capacity: int64(maxConn),
refreshRate: refreshRate,
tokens: 0,
lastToken: time.Now(),
}
return func(c *gin.Context) {
if !tb.Allow() {
c.String(503, "Too many request")
c.Abort()
return
}
c.Next()
}
}

Loading…
Cancel
Save