SpringCloud--服务接口调用--Ribbon原理分析

  1. Ribbon的负载均衡轮询的原理:
    1.  

    2.  

    3.  

       

    4.  

    5. package com.model.lb;
      
      import org.springframework.cloud.client.ServiceInstance;
      
      import java.util.List;
      
      /**
       * @Description:测试类
       * @Author: 张紫韩
       * @Crete 2021/9/8 16:09
       */
      public interface LoadBalancer {
          public ServiceInstance instances(List<ServiceInstance> serviceInstances);
      }
    6. package com.model.lb;
      
      import org.springframework.cloud.client.ServiceInstance;
      import org.springframework.cloud.client.loadbalancer.LoadBalanced;
      import org.springframework.stereotype.Component;
      
      import java.lang.annotation.Annotation;
      import java.util.List;
      import java.util.concurrent.atomic.AtomicInteger;
      
      /**
       * @Description:测试类
       * @Author: 张紫韩
       * @Crete 2021/9/8 16:09
       */
      @Component
      public class LoadBalancerImpl 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 ));
              System.out.println("******************第"+current+"次访问******************");
              return next;
          }
          @Override
          public ServiceInstance instances(List<ServiceInstance> serviceInstances) {
              int index=getAndIncrement()%serviceInstances.size();
              return serviceInstances.get(index);
          }
      }
    7. public String getPaymentLB(){
              String serviceName="SPRINGCLOUD001-PROVIDER-PAYMENT";
              List<ServiceInstance> instances = discoveryClient.getInstances(serviceName);
              if (instances==null||instances.size()<=0){
                  return null;
              }
              ServiceInstance serviceInstance = loadBalancer.instances(instances);
              URI uri = serviceInstance.getUri();
              return restTemplate.getForObject(uri+"/payment/lb",String.class);
          }
    8.   

       

       

       

posted @ 2021-09-08 17:03  张紫韩  阅读(94)  评论(0编辑  收藏  举报