Пример #1
0
func (r *RoundRobin) SetMax(rp *tykcommon.HostList) {
	if r.max = rp.Len() - 1; r.max < 0 {
		r.max = 0
	}

	// Can't have a new list substituted that's shorter
	if r.cur > r.max {
		r.cur = 0
	}
	if r.pos > r.max {
		r.pos = 0
	}
}
func GetNextTarget(targetData *tykcommon.HostList, spec *APISpec, tryCount int) string {
	if spec.Proxy.EnableLoadBalancing {
		log.Debug("[PROXY] [LOAD BALANCING] Load balancer enabled, getting upstream target")
		// Use a HostList
		spec.RoundRobin.SetMax(targetData)

		pos := spec.RoundRobin.GetPos()
		if pos > (targetData.Len() - 1) {
			// problem
			spec.RoundRobin.SetMax(targetData)
			pos = 0
		}

		gotHost, err := targetData.GetIndex(pos)
		if err != nil {
			log.Error("[PROXY] [LOAD BALANCING] ", err)
			return gotHost
		}

		thisHost := EnsureTransport(gotHost)

		// Check hosts against uptime tests
		if spec.Proxy.CheckHostAgainstUptimeTests {
			if !GlobalHostChecker.IsHostDown(thisHost) {
				// Don't overdo it
				if tryCount < targetData.Len() {
					// Host is down, skip
					return GetNextTarget(targetData, spec, tryCount+1)
				}
				log.Error("[PROXY] [LOAD BALANCING] All hosts seem to be down, all uptime tests are failing!")
			}
		}

		return thisHost
	}
	// Use standard target - might still be service data
	log.Debug("TARGET DATA:", targetData)

	gotHost, err := targetData.GetIndex(0)
	if err != nil {
		log.Error("[PROXY] ", err)
		return gotHost
	}
	return EnsureTransport(gotHost)
}