该算法采用自旋锁加CAS指令:
1、算法核心思想:
通过微服务名来获取所有活着的服务。
List<ServiceInstance> serviceList = discoveryClient.getInstances("微服务名");
如:
127.0.0.1:8001 = serviceList.get(0) 第一个服务
127.0.0.1:8002 = serviceList.get(1) 第二个服务
。。。
这个两个服务作为集群,总服务数数为2。那么轮循的意思:
第一次调用:n = 1 ; n % 2 = 1 ,那么就调用 serviceList.get(1);
第二次调用:n = 2 ; n % 2 = 0 ,那么就调用 serviceList.get(0);
。。。
2、算法的实现:
private AtomicInteger atomicInteger = new AtomicInteger(0); public int getIncrementNum(){ int current; int next; //这里使用do while 来实现自旋锁, //不要用synchronized和lock 这两把锁比较重。来使用CAS来进行实现赋值。 do { current = this.atomicInteger.get(); //next = current + 1;//切记不要超过2147483647 next = current >= 2147483647 ? 0 : current + 1 ; } while (!this.atomicInteger.compareAndSet(current, next)); //第几次访问 next为第几次 return next; } public ServiceInstance service(List<ServiceInstance> serviceInstanceList){ if (serviceInstanceList==null||serviceInstanceList.size()==0){ return null; } int index = this.getIncrementNum() % serviceInstanceList.size(); return serviceInstanceList.get(index); }
一起学习!一起分享!