「リボン負荷分散アルゴリズム」の基本的な考え方を組み合わせて、負荷分散アルゴリズムの例を記述します

リボン負荷分散アルゴリズム

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

ヒント:負荷分散アルゴリズムを自分で作成する場合は、@ LoadBalancedアノテーションをコメントアウトする必要があります。

おすすめ

転載: blog.csdn.net/weixin_45496190/article/details/107436600