GetServer 随机选择一个服务器
(key string)
| 20 | |
| 21 | // GetServer 随机选择一个服务器 |
| 22 | func (r *RandomLoadBalancer) GetServer(key string) *Server { |
| 23 | r.mu.RLock() |
| 24 | defer r.mu.RUnlock() |
| 25 | |
| 26 | // 过滤出可用的服务器 |
| 27 | availableServers := make([]*Server, 0) |
| 28 | for _, server := range r.Servers { |
| 29 | if server.Weight > 0 { |
| 30 | availableServers = append(availableServers, server) |
| 31 | } |
| 32 | } |
| 33 | |
| 34 | if len(availableServers) == 0 { |
| 35 | return nil |
| 36 | } |
| 37 | |
| 38 | // 计算总权重 |
| 39 | totalWeight := 0 |
| 40 | for _, server := range availableServers { |
| 41 | totalWeight += server.Weight |
| 42 | } |
| 43 | |
| 44 | // 随机选择一个服务器(考虑权重) |
| 45 | randomWeight := r.rng.Intn(totalWeight) |
| 46 | currentWeight := 0 |
| 47 | for _, server := range availableServers { |
| 48 | currentWeight += server.Weight |
| 49 | if randomWeight < currentWeight { |
| 50 | return server |
| 51 | } |
| 52 | } |
| 53 | |
| 54 | // 如果因为浮点数精度问题没有选中任何服务器,返回最后一个 |
| 55 | return availableServers[len(availableServers)-1] |
| 56 | } |