You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
31 lines
596 B
31 lines
596 B
3 years ago
|
package balancer
|
||
|
|
||
|
import (
|
||
|
"reflect"
|
||
|
"sync/atomic"
|
||
|
)
|
||
|
|
||
|
type RoundRobin struct {
|
||
|
current uint64
|
||
|
}
|
||
|
|
||
|
// NextPeer 返回轮盘的下一节点
|
||
|
func (r *RoundRobin) NextPeer(nodes interface{}) (error, interface{}) {
|
||
|
v := reflect.ValueOf(nodes)
|
||
|
if v.Kind() != reflect.Slice {
|
||
|
return ErrInputNotSlice, nil
|
||
|
}
|
||
|
|
||
|
if v.Len() == 0 {
|
||
|
return ErrNoAvaliableNode, nil
|
||
|
}
|
||
|
|
||
|
next := r.NextIndex(v.Len())
|
||
|
return nil, v.Index(next).Interface()
|
||
|
}
|
||
|
|
||
|
// NextIndex 返回下一个节点下标
|
||
|
func (r *RoundRobin) NextIndex(total int) int {
|
||
|
return int(atomic.AddUint64(&r.current, uint64(1)) % uint64(total))
|
||
|
}
|