From: qydysky Date: Fri, 18 Oct 2024 16:07:07 +0000 (+0800) Subject: 1 X-Git-Tag: v0.1.20241018160851 X-Git-Url: http://127.0.0.1:8081/?a=commitdiff_plain;h=5834634a340c5408bb83d47ec564cd5306d2688f;p=front%2F.git 1 --- diff --git a/README.md b/README.md index a845dc6..bb7d4d3 100755 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ config: - pathAdd: bool 将客户端访问的路径附加在path上 例:/api/req => /ws => /ws/api/req - rollRule: string 可选 - `order`(按顺序) + - `loop`(轮流) - `disableC_MinFirst`(禁用数较少的优先) - `dealingC_MinFirst`(连接数较少的优先) - `chosenC_MinFirst`(被选择较少的优先) diff --git a/config.go b/config.go index 6b0cd58..bb71c6b 100755 --- a/config.go +++ b/config.go @@ -146,7 +146,7 @@ func (t *Config) SwapSign(ctx context.Context, logger Logger) { } if aok { - for i := 0; i < backP.(*Back).Weight; i++ { + for i := uint(0); i < backP.(*Back).Weight; i++ { backIs = append(backIs, backP.(*Back)) } } @@ -292,6 +292,7 @@ func (t *Route) SwapSign(logger Logger) { logger.Info(`I:`, fmt.Sprintf("%v > %v > %v", t.config.Addr, t.Path, t.Backs[i].Name)) t.backMap.Store(t.Backs[i].Id(), &t.Backs[i]) } + t.Backs[i].index = i t.Backs[i].SwapSign(logger) } } @@ -301,7 +302,7 @@ func (t *Route) FiliterBackByRequest(r *http.Request) []*Back { for i := 0; i < len(t.Backs); i++ { if ok, e := t.Backs[i].getFiliterReqHeader().Match(r.Header); ok && e == nil { t.Backs[i].route = t - for k := 0; k < t.Backs[i].Weight; k++ { + for k := uint(0); k < t.Backs[i].Weight; k++ { backLink = append(backLink, &t.Backs[i]) } } @@ -317,17 +318,19 @@ func (t *Route) FiliterBackByRequest(r *http.Request) []*Back { } type Back struct { - route *Route `json:"-"` - lock sync.RWMutex `json:"-"` - upT time.Time `json:"-"` - disableC int `json:"-"` - dealingC int `json:"-"` - chosenC int `json:"-"` + route *Route `json:"-"` + lock sync.RWMutex `json:"-"` + upT time.Time `json:"-"` + index int `json:"-"` + disableC uint `json:"-"` + dealingC uint `json:"-"` + chosenC uint `json:"-"` + lastResDru time.Duration `json:"-"` Name string `json:"name"` To string `json:"to"` - Weight int `json:"weight"` + Weight uint `json:"weight"` AlwaysUp bool `json:"alwaysUp"` Setting diff --git a/rollRule.go b/rollRule.go index 31acd82..c7b4642 100644 --- a/rollRule.go +++ b/rollRule.go @@ -12,19 +12,25 @@ func init() { rollRuleMap[`disable_MinFirst`] = func(backLink []*Back) { slices.SortStableFunc(backLink, func(a, b *Back) int { - return a.disableC/(a.Weight+1) - b.disableC/(b.Weight+1) + return int(a.disableC/(a.Weight+1) - b.disableC/(b.Weight+1)) }) } rollRuleMap[`dealingC_MinFirst`] = func(backLink []*Back) { slices.SortStableFunc(backLink, func(a, b *Back) int { - return a.dealingC/(a.Weight+1) - b.dealingC/(b.Weight+1) + return int(a.dealingC/(a.Weight+1) - b.dealingC/(b.Weight+1)) }) } rollRuleMap[`chosenC_MinFirst`] = func(backLink []*Back) { slices.SortStableFunc(backLink, func(a, b *Back) int { - return a.chosenC/(a.Weight+1) - b.chosenC/(b.Weight+1) + return int(a.chosenC/(a.Weight+1) - b.chosenC/(b.Weight+1)) + }) + } + + rollRuleMap[`loop`] = func(backLink []*Back) { + slices.SortStableFunc(backLink, func(a, b *Back) int { + return a.index - b.index }) } }