gitee.com/liuxuezhan/go-micro-v1.18.0@v1.0.0/client/selector/strategy.go (about) 1 package selector 2 3 import ( 4 "math/rand" 5 "sync" 6 "time" 7 8 "gitee.com/liuxuezhan/go-micro-v1.18.0/registry" 9 ) 10 11 func init() { 12 rand.Seed(time.Now().UnixNano()) 13 } 14 15 // Random is a random strategy algorithm for node selection 16 func Random(services []*registry.Service) Next { 17 nodes := make([]*registry.Node, 0, len(services)) 18 19 for _, service := range services { 20 nodes = append(nodes, service.Nodes...) 21 } 22 23 return func() (*registry.Node, error) { 24 if len(nodes) == 0 { 25 return nil, ErrNoneAvailable 26 } 27 28 i := rand.Int() % len(nodes) 29 return nodes[i], nil 30 } 31 } 32 33 // RoundRobin is a roundrobin strategy algorithm for node selection 34 func RoundRobin(services []*registry.Service) Next { 35 nodes := make([]*registry.Node, 0, len(services)) 36 37 for _, service := range services { 38 nodes = append(nodes, service.Nodes...) 39 } 40 41 var i = rand.Int() 42 var mtx sync.Mutex 43 44 return func() (*registry.Node, error) { 45 if len(nodes) == 0 { 46 return nil, ErrNoneAvailable 47 } 48 49 mtx.Lock() 50 node := nodes[i%len(nodes)] 51 i++ 52 mtx.Unlock() 53 54 return node, nil 55 } 56 }