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  }