Move selector to client/selector
This commit is contained in:
		
							
								
								
									
										56
									
								
								client/selector/strategy.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								client/selector/strategy.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| package selector | ||||
|  | ||||
| import ( | ||||
| 	"math/rand" | ||||
| 	"sync" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/micro/go-micro/registry" | ||||
| ) | ||||
|  | ||||
| func init() { | ||||
| 	rand.Seed(time.Now().UnixNano()) | ||||
| } | ||||
|  | ||||
| // Random is a random strategy algorithm for node selection | ||||
| func Random(services []*registry.Service) Next { | ||||
| 	var nodes []*registry.Node | ||||
|  | ||||
| 	for _, service := range services { | ||||
| 		nodes = append(nodes, service.Nodes...) | ||||
| 	} | ||||
|  | ||||
| 	return func() (*registry.Node, error) { | ||||
| 		if len(nodes) == 0 { | ||||
| 			return nil, ErrNoneAvailable | ||||
| 		} | ||||
|  | ||||
| 		i := rand.Int() % len(nodes) | ||||
| 		return nodes[i], nil | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // RoundRobin is a roundrobin strategy algorithm for node selection | ||||
| func RoundRobin(services []*registry.Service) Next { | ||||
| 	var nodes []*registry.Node | ||||
|  | ||||
| 	for _, service := range services { | ||||
| 		nodes = append(nodes, service.Nodes...) | ||||
| 	} | ||||
|  | ||||
| 	var i = rand.Int() | ||||
| 	var mtx sync.Mutex | ||||
|  | ||||
| 	return func() (*registry.Node, error) { | ||||
| 		if len(nodes) == 0 { | ||||
| 			return nil, ErrNoneAvailable | ||||
| 		} | ||||
|  | ||||
| 		mtx.Lock() | ||||
| 		node := nodes[i%len(nodes)] | ||||
| 		i++ | ||||
| 		mtx.Unlock() | ||||
|  | ||||
| 		return node, nil | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user