Create & Init Project...
This commit is contained in:
55
library/net/http/blademaster/middleware/limit/aqm/BUILD
Normal file
55
library/net/http/blademaster/middleware/limit/aqm/BUILD
Normal file
@ -0,0 +1,55 @@
|
||||
package(default_visibility = ["//visibility:public"])
|
||||
|
||||
load(
|
||||
"@io_bazel_rules_go//go:def.bzl",
|
||||
"go_test",
|
||||
"go_library",
|
||||
)
|
||||
|
||||
go_test(
|
||||
name = "go_default_test",
|
||||
srcs = ["aqm_test.go"],
|
||||
embed = [":go_default_library"],
|
||||
rundir = ".",
|
||||
tags = ["automanaged"],
|
||||
deps = [
|
||||
"//library/log:go_default_library",
|
||||
"//library/net/http/blademaster:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
go_library(
|
||||
name = "go_default_library",
|
||||
srcs = ["aqm.go"],
|
||||
importpath = "go-common/library/net/http/blademaster/middleware/limit/aqm",
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
deps = [
|
||||
"//library/container/queue/aqm:go_default_library",
|
||||
"//library/ecode:go_default_library",
|
||||
"//library/net/http/blademaster:go_default_library",
|
||||
"//library/rate:go_default_library",
|
||||
"//library/rate/limit:go_default_library",
|
||||
"//library/stat/prom:go_default_library",
|
||||
],
|
||||
)
|
||||
|
||||
go_test(
|
||||
name = "go_default_xtest",
|
||||
srcs = ["example_test.go"],
|
||||
tags = ["automanaged"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "package-srcs",
|
||||
srcs = glob(["**"]),
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:private"],
|
||||
)
|
||||
|
||||
filegroup(
|
||||
name = "all-srcs",
|
||||
srcs = [":package-srcs"],
|
||||
tags = ["automanaged"],
|
||||
visibility = ["//visibility:public"],
|
||||
)
|
@ -0,0 +1,5 @@
|
||||
### business/blademaster/supervisor
|
||||
|
||||
##### Version 1.0.0
|
||||
|
||||
1. 完成基本功能与测试
|
@ -0,0 +1,5 @@
|
||||
# Author
|
||||
lintnaghui
|
||||
|
||||
# Reviewer
|
||||
maojian
|
7
library/net/http/blademaster/middleware/limit/aqm/OWNERS
Normal file
7
library/net/http/blademaster/middleware/limit/aqm/OWNERS
Normal file
@ -0,0 +1,7 @@
|
||||
# See the OWNERS docs at https://go.k8s.io/owners
|
||||
|
||||
approvers:
|
||||
- lintnaghui
|
||||
reviewers:
|
||||
- lintnaghui
|
||||
- maojian
|
13
library/net/http/blademaster/middleware/limit/aqm/README.md
Normal file
13
library/net/http/blademaster/middleware/limit/aqm/README.md
Normal file
@ -0,0 +1,13 @@
|
||||
#### business/blademaster/supervisor
|
||||
|
||||
##### 项目简介
|
||||
|
||||
blademaster 的 aqm middleware,主动队列管理,请求延迟检测于优先级策略管理
|
||||
|
||||
##### 编译环境
|
||||
|
||||
- **请只用 Golang v1.8.x 以上版本编译执行**
|
||||
|
||||
##### 依赖包
|
||||
|
||||
- No other dependency
|
54
library/net/http/blademaster/middleware/limit/aqm/aqm.go
Normal file
54
library/net/http/blademaster/middleware/limit/aqm/aqm.go
Normal file
@ -0,0 +1,54 @@
|
||||
package aqm
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"go-common/library/container/queue/aqm"
|
||||
"go-common/library/ecode"
|
||||
bm "go-common/library/net/http/blademaster"
|
||||
"go-common/library/rate"
|
||||
"go-common/library/rate/limit"
|
||||
"go-common/library/stat/prom"
|
||||
)
|
||||
|
||||
const (
|
||||
_family = "blademaster"
|
||||
)
|
||||
|
||||
var (
|
||||
stats = prom.New().WithState("go_active_queue_mng", []string{"family", "title"})
|
||||
)
|
||||
|
||||
// AQM aqm midleware.
|
||||
type AQM struct {
|
||||
limiter rate.Limiter
|
||||
}
|
||||
|
||||
// New return a ratelimit midleware.
|
||||
func New(conf *aqm.Config) (s *AQM) {
|
||||
return &AQM{
|
||||
limiter: limit.New(conf),
|
||||
}
|
||||
}
|
||||
|
||||
// Limit return a bm handler func.
|
||||
func (a *AQM) Limit() bm.HandlerFunc {
|
||||
return func(c *bm.Context) {
|
||||
done, err := a.limiter.Allow(c)
|
||||
if err != nil {
|
||||
stats.Incr(_family, c.Request.URL.Path[1:])
|
||||
// TODO: priority request.
|
||||
// c.JSON(nil, err)
|
||||
// c.Abort()
|
||||
return
|
||||
}
|
||||
defer func() {
|
||||
if c.Error != nil && !ecode.Deadline.Equal(c.Error) && c.Err() != context.DeadlineExceeded {
|
||||
done(rate.Ignore)
|
||||
return
|
||||
}
|
||||
done(rate.Success)
|
||||
}()
|
||||
c.Next()
|
||||
}
|
||||
}
|
@ -0,0 +1,47 @@
|
||||
package aqm
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"sync"
|
||||
"sync/atomic"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"go-common/library/log"
|
||||
bm "go-common/library/net/http/blademaster"
|
||||
)
|
||||
|
||||
func init() {
|
||||
log.Init(nil)
|
||||
}
|
||||
|
||||
func TestAQM(t *testing.T) {
|
||||
var group sync.WaitGroup
|
||||
rand.Seed(time.Now().Unix())
|
||||
eng := bm.Default()
|
||||
router := eng.Use(New(nil).Limit())
|
||||
router.GET("/aqm", testaqm)
|
||||
go eng.Run(":9999")
|
||||
var errcount int64
|
||||
for i := 0; i < 100; i++ {
|
||||
group.Add(1)
|
||||
go func() {
|
||||
defer group.Done()
|
||||
for j := 0; j < 300; j++ {
|
||||
_, err := http.Get("http://127.0.0.1:9999/aqm")
|
||||
if err != nil {
|
||||
atomic.AddInt64(&errcount, 1)
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
group.Wait()
|
||||
fmt.Println("errcount", errcount)
|
||||
}
|
||||
|
||||
func testaqm(ctx *bm.Context) {
|
||||
count := rand.Intn(100)
|
||||
time.Sleep(time.Millisecond * time.Duration(count))
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package aqm_test
|
||||
|
||||
// This example create a supervisor middleware instance and attach to a blademaster engine,
|
||||
// it will allow '/ping' API can be requested with specified policy.
|
||||
// This example will block all http method except `GET` on '/ping' API in next hour,
|
||||
// and allow in further.
|
||||
func Example() {
|
||||
|
||||
}
|
Reference in New Issue
Block a user