nacos 手动实现负载均衡
手动实现源码
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.stereotype.Component; import java.net.InetAddress; import java.util.List; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; /** * nacos 手动实现服务治理负责均衡 随机,轮询,Hash */ @Component public class ServiceInstanceLoadBalancer { //nacos 提供者服务名称 @Value("${server.cloud.name}") private String providerServer; //负载均衡策略,该配置可改成动态方式 @Value("${server.instance.type:0}") private String instanceType; // 0-随机,1-轮询,2-Hash //随机 private static final String RANDOM = "0"; //轮询 //private static final String POLL = "1"; //Hash private static final String HASH = "2"; //获取随机数 private static final Random random = new Random(); //CAS 原子类 用于轮询使用 private AtomicInteger poll = new AtomicInteger(0); //nacos注册服务客户端 @Autowired protected DiscoveryClient discoveryClient; //获取服务提供者 public ServiceInstance getServiceInstance(){ List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances(providerServer); ServiceInstance serviceInstance =null; try { if (RANDOM.equals(instanceType)) {//随机 serviceInstance = serviceInstanceList.get(random.nextInt(serviceInstanceList.size())); } else if (HASH.equals(instanceType)) {//IP Hash serviceInstance = serviceInstanceList.get(getIpHash() % serviceInstanceList.size()); } else {//轮询,默认 serviceInstance = serviceInstanceList.get(poll.getAndIncrement() % serviceInstanceList.size()); } }catch (Exception e){ } return serviceInstance; } //获取本地IP Hash 值 private int getIpHash(){ try { return InetAddress.getLocalHost().getHostAddress().hashCode(); } catch (Exception e) { return 0; } } } |
属性字段解释
String providerServer : nacos 服务端提供者服务名称
String instanceType :负载均衡策略,该配置可改成动态方式(disconf,apollo,redis)
Random random :随机数轮询
AtomicInteger poll:CAS 原子类 用于轮询自增使用
DiscoveryClient discoveryClient: nacos 提供者客户端获取所有服务
方法解释
public ServiceInstance getServiceInstance()
根据instanceType策略(0-随机,1-轮询,2-Hash)获取服务端server
private int getIpHash()
获取本地IP地址转为HashCode(int),用于Hash方式获取服务端server