mirror of
https://github.com/XTLS/Xray-core.git
synced 2024-11-22 20:59:19 +02:00
add Round-Robin Strategy to balancer (#2844)
* add Round-Robin Strategy * clean up
This commit is contained in:
parent
9becf02316
commit
01c14a5994
|
@ -2,6 +2,7 @@ package router
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
sync "sync"
|
||||||
|
|
||||||
"github.com/xtls/xray-core/common/dice"
|
"github.com/xtls/xray-core/common/dice"
|
||||||
"github.com/xtls/xray-core/features/extension"
|
"github.com/xtls/xray-core/features/extension"
|
||||||
|
@ -23,6 +24,39 @@ func (s *RandomStrategy) PickOutbound(tags []string) string {
|
||||||
return tags[dice.Roll(n)]
|
return tags[dice.Roll(n)]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type RoundRobinStrategy struct {
|
||||||
|
mu sync.Mutex
|
||||||
|
tags []string
|
||||||
|
index int
|
||||||
|
roundRobin *RoundRobinStrategy
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewRoundRobin(tags []string) *RoundRobinStrategy {
|
||||||
|
return &RoundRobinStrategy{
|
||||||
|
tags: tags,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func (r *RoundRobinStrategy) NextTag() string {
|
||||||
|
r.mu.Lock()
|
||||||
|
defer r.mu.Unlock()
|
||||||
|
|
||||||
|
tags := r.tags[r.index]
|
||||||
|
r.index = (r.index + 1) % len(r.tags)
|
||||||
|
return tags
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *RoundRobinStrategy) PickOutbound(tags []string) string {
|
||||||
|
if len(tags) == 0 {
|
||||||
|
panic("0 tags")
|
||||||
|
}
|
||||||
|
if s.roundRobin == nil {
|
||||||
|
s.roundRobin = NewRoundRobin(tags)
|
||||||
|
}
|
||||||
|
tag := s.roundRobin.NextTag()
|
||||||
|
|
||||||
|
return tag
|
||||||
|
}
|
||||||
|
|
||||||
type Balancer struct {
|
type Balancer struct {
|
||||||
selectors []string
|
selectors []string
|
||||||
strategy BalancingStrategy
|
strategy BalancingStrategy
|
||||||
|
|
|
@ -129,6 +129,12 @@ func (br *BalancingRule) Build(ohm outbound.Manager) (*Balancer, error) {
|
||||||
strategy: &LeastPingStrategy{},
|
strategy: &LeastPingStrategy{},
|
||||||
ohm: ohm,
|
ohm: ohm,
|
||||||
}, nil
|
}, nil
|
||||||
|
case "roundRobin":
|
||||||
|
return &Balancer{
|
||||||
|
selectors: br.OutboundSelector,
|
||||||
|
strategy: &RoundRobinStrategy{},
|
||||||
|
ohm: ohm,
|
||||||
|
}, nil
|
||||||
case "random":
|
case "random":
|
||||||
fallthrough
|
fallthrough
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -43,6 +43,8 @@ func (r *BalancingRule) Build() (*router.BalancingRule, error) {
|
||||||
strategy = strategyRandom
|
strategy = strategyRandom
|
||||||
case strategyLeastPing:
|
case strategyLeastPing:
|
||||||
strategy = "leastPing"
|
strategy = "leastPing"
|
||||||
|
case strategyRoundRobin:
|
||||||
|
strategy = "roundRobin"
|
||||||
default:
|
default:
|
||||||
return nil, newError("unknown balancing strategy: " + r.Strategy.Type)
|
return nil, newError("unknown balancing strategy: " + r.Strategy.Type)
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,4 +3,5 @@ package conf
|
||||||
const (
|
const (
|
||||||
strategyRandom string = "random"
|
strategyRandom string = "random"
|
||||||
strategyLeastPing string = "leastping"
|
strategyLeastPing string = "leastping"
|
||||||
|
strategyRoundRobin string = "roundrobin"
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue