一、首先注释 @LoadBalanced 默认的负载均衡算法,使用我们自己的
![](https://img.haomeiwen.com/i17789669/e983b774cc1a01b3.png)
image.png
二、定义我们自己的 LoadBalancer
![](https://img.haomeiwen.com/i17789669/bc80caaf8edd97e6.png)
image.png
- 接口
public interface LoadBalancer {
ServiceInstance instances(List<ServiceInstance> serviceInstanceList);
}
- 实现类
/**
* 手写轮询算法
*/
@Component
public class MyLoadBalancer implements LoadBalancer{
private AtomicInteger atomicInteger = new AtomicInteger(0);
private final int getAndIncrement(){
int current;
int next;
do {
current=this.atomicInteger.get();
next = current >= 2147483647 ? 0 :current + 1; //int 最大值 2147483647
}while (!this.atomicInteger.compareAndSet(current,next));
System.out.println("*******第几次访问呢,次数next:"+next);
return next;
}
@Override
public ServiceInstance instances(List<ServiceInstance> serviceInstanceList) {
int index=getAndIncrement() % serviceInstanceList.size();
return serviceInstanceList.get(index);
}
}
三、 controller 调用
@Resource
RestTemplate restTemplate;
@Resource
LoadBalancer loadBalancer;
/**
* 使用自定义的轮询算法
* @return
*/
@GetMapping(value = "/consumer/lb")
public String getLoadBalancerLb(){
List<ServiceInstance> instanceList = discoveryClient.getInstances("CLOUD-PROVIDER");
if(instanceList == null || instanceList.size()<=0){
return null;
}
ServiceInstance instances = loadBalancer.instances(instanceList);
URI uri = instances.getUri();
return restTemplate.getForObject(uri+"/provider/hello/自定义轮询",String.class);
}
四、测试调用,测试成功
![](https://img.haomeiwen.com/i17789669/a4dad16836e55a2c.png)
第一次调用.png
![](https://img.haomeiwen.com/i17789669/33c1fe5b54a6b6a5.png)
第二次调用.png
网友评论