リボン負荷分散アルゴリズム
1.原則
インターフェイス要求の要求数%サーバークラスターの総数=実際の呼び出しサーバーの場所のインデックス(つまり、現在取得されているサーバー)。要求インターフェイスの数は、サーバーの再起動ごとに1から再開されます。(理解するには下の図を参照してください)
2.ローカル負荷分散アルゴリズムを自分で作成します
a)最初に負荷分散インターフェース(LoadBalancer)を作成します
public interface LoadBalancer {
ServiceInstance instances(List<ServiceInstance> serviceInstances);
}
b)このインターフェースの実装クラスを作成します
@Component
public class MyLB implements LoadBalancer {
private AtomicInteger atomicInteger = new AtomicInteger(0);
public final int getAndIncrement(){
int current;
int next;
do{
current = this.atomicInteger.get();
next = current >= 2147483647 ? 0 : current + 1;
}while (!this.atomicInteger.compareAndSet(current,next));
//compareAndSet 方法为若current和期望值一致,则将这个值替换为next
System.out.println("*****第几次访问,次数next: "+next);
return next;
}
@Override
public ServiceInstance instances(List<ServiceInstance> serviceInstances) {
int index = getAndIncrement() % serviceInstances.size();
return serviceInstances.get(index);
}
}
c)コントローラーレイヤーに対応するメソッドを作成します
@GetMapping(value = "/consumer/payment/lb")
public String getPaymentLB(){
List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
//从eureka服务中心发现并获得名为CLOUD-PAYMENT-SERVICE服务中的集群服务器
if (instances==null||instances.size()<=0){
return null;
}
ServiceInstance instance = loadBalancer.instances(instances);
//利用自己写的负载均衡接口处理服务
URI uri = instance.getUri();
return restTemplate.getForObject(uri+"/payment/lb",String.class);
}
d)ブラウザにURLアドレステストを入力します
http://localhost/consumer/payment/lb