Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View 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"],
)

View File

@ -0,0 +1,5 @@
### business/blademaster/supervisor
##### Version 1.0.0
1. 完成基本功能与测试

View File

@ -0,0 +1,5 @@
# Author
lintnaghui
# Reviewer
maojian

View File

@ -0,0 +1,7 @@
# See the OWNERS docs at https://go.k8s.io/owners
approvers:
- lintnaghui
reviewers:
- lintnaghui
- maojian

View File

@ -0,0 +1,13 @@
#### business/blademaster/supervisor
##### 项目简介
blademaster 的 aqm middleware主动队列管理请求延迟检测于优先级策略管理
##### 编译环境
- **请只用 Golang v1.8.x 以上版本编译执行**
##### 依赖包
- No other dependency

View 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()
}
}

View File

@ -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))
}

View File

@ -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() {
}