|
|
|
package loadbalancer
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"math/rand"
|
|
|
|
"reflect"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (lb *LoadBalancer) setServers(serverAddresses []string) bool {
|
|
|
|
serverAddresses, hasOriginalServer := sortServers(serverAddresses, lb.defaultServerAddress)
|
|
|
|
if len(serverAddresses) == 0 {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
lb.mutex.Lock()
|
|
|
|
defer lb.mutex.Unlock()
|
|
|
|
|
|
|
|
if reflect.DeepEqual(serverAddresses, lb.ServerAddresses) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
lb.ServerAddresses = serverAddresses
|
|
|
|
lb.randomServers = append([]string{}, lb.ServerAddresses...)
|
|
|
|
rand.Shuffle(len(lb.randomServers), func(i, j int) {
|
|
|
|
lb.randomServers[i], lb.randomServers[j] = lb.randomServers[j], lb.randomServers[i]
|
|
|
|
})
|
|
|
|
if !hasOriginalServer {
|
|
|
|
lb.randomServers = append(lb.randomServers, lb.defaultServerAddress)
|
|
|
|
}
|
|
|
|
lb.currentServerAddress = lb.randomServers[0]
|
|
|
|
lb.nextServerIndex = 1
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
func (lb *LoadBalancer) nextServer(failedServer string) (string, error) {
|
|
|
|
lb.mutex.Lock()
|
|
|
|
defer lb.mutex.Unlock()
|
|
|
|
|
|
|
|
if len(lb.randomServers) == 0 {
|
|
|
|
return "", errors.New("No servers in load balancer proxy list")
|
|
|
|
}
|
|
|
|
if len(lb.randomServers) == 1 {
|
|
|
|
return lb.currentServerAddress, nil
|
|
|
|
}
|
|
|
|
if failedServer != lb.currentServerAddress {
|
|
|
|
return lb.currentServerAddress, nil
|
|
|
|
}
|
|
|
|
if lb.nextServerIndex >= len(lb.randomServers) {
|
|
|
|
lb.nextServerIndex = 0
|
|
|
|
}
|
|
|
|
|
|
|
|
lb.currentServerAddress = lb.randomServers[lb.nextServerIndex]
|
|
|
|
lb.nextServerIndex++
|
|
|
|
|
|
|
|
return lb.currentServerAddress, nil
|
|
|
|
}
|