1: 重写MyLoadBalance接口
public interface MyLoadBalance {
ServiceInstance instances(List<ServiceInstance> serviceInstanceList);
}
2: 写负载均衡算法@Component不要忘记
@Component
public class MyLb implements MyLoadBalance {
private AtomicInteger atomicInteger=new AtomicInteger(0);
private final int getAndIncrement(){
int curr;
int next;
do{
curr=this.atomicInteger.get();
next=curr>=Integer.MAX_VALUE ? 0: curr+1;
}while (!this.atomicInteger.compareAndSet(curr,next));
System.out.println("-----:第几次访问next:"+next);
return next;
};
@Override
public ServiceInstance instances(List<ServiceInstance> serviceInstanceList) {
int index = getAndIncrement() % serviceInstanceList.size();
return serviceInstanceList.get(index);
}
}
3: 去掉config上默认的balance
@Configuration
public class ApplicationContextConfig {
@Bean
// @LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
4: controller
// http://localhost:8082/order/consumer/lb
@GetMapping("consumer/lb")
public String getLb(){
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
if(instances == null || instances.size() == 0 ){
return "查询失败";
}
ServiceInstance serviceInstance = myLb.instances(instances);
URI uri = serviceInstance.getUri();
System.out.println("-----:"+uri+"/payment/lb");
return restTemplate.getForObject(uri+"/payment/lb",String.class);
}