• Ribbon负载均衡算法


    负载均衡算法:rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标  ,每次服务重启动后rest接口计数从1开始。
     
    List instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
     
    如:   List [0] instances = 127.0.0.1:8002
       List [1] instances = 127.0.0.1:8001
     
    8001+ 8002 组合成为集群,它们共计2台机器,集群总数为2, 按照轮询算法原理:
     
    当总请求数为1时: 1 % 2 =1 对应下标位置为1 ,则获得服务地址为127.0.0.1:8001
    当总请求数位2时: 2 % 2 =0 对应下标位置为0 ,则获得服务地址为127.0.0.1:8002
    当总请求数位3时: 3 % 2 =1 对应下标位置为1 ,则获得服务地址为127.0.0.1:8001
    当总请求数位4时: 4 % 2 =0 对应下标位置为0 ,则获得服务地址为127.0.0.1:8002
    如此类推......

     

    写一个本地负载均衡器 

    设现在有俩个服务端口8001 8002幼由80端口调动

    其中8001 8002 的controller中 

    1. @GetMapping(value = "/payment/lb")
    2. public String getPaymentLB()
    3. {
    4. return serverPort;
    5. }

    80 的一个接口为:

    1. public interface LoadBalancer
    2. {
    3. ServiceInstance instances(List serviceInstances);
    4. }

     实现类

    1. @Component
    2. public class MyLB implements LoadBalancer
    3. {
    4. private AtomicInteger atomicInteger = new AtomicInteger(0);
    5. public final int getAndIncrement()
    6. {
    7. int current;
    8. int next;
    9. do
    10. {
    11. current = this.atomicInteger.get();
    12. next = current >= 2147483647 ? 0 : current + 1;
    13. } while(!this.atomicInteger.compareAndSet(current, next));
    14. System.out.println("*****next: "+next);
    15. return next;
    16. }
    17. @Override
    18. public ServiceInstance instances(List serviceInstances)
    19. {
    20. int index = getAndIncrement() % serviceInstances.size();
    21. return serviceInstances.get(index);
    22. }
    23. }

    调用 方法

    1. @Resource
    2. private RestTemplate restTemplate;
    3. //可以获取注册中心上的服务列表
    4. @Resource
    5. private DiscoveryClient discoveryClient;
    6. @Resource
    7. private LoadBalancer loadBalancer;
    8. @GetMapping("/consumer/payment/lb")
    9. public String getPaymentLB()
    10. {
    11. List instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
    12. if(instances == null || instances.size()<=0) {
    13. return null;
    14. }
    15. ServiceInstance serviceInstance = loadBalancer.instances(instances);
    16. URI uri = serviceInstance.getUri();
    17. return restTemplate.getForObject(uri+"/payment/lb",String.class);
    18. }

    ApplicationContextBean去掉注解@LoadBalanced 

  • 相关阅读:
    第一章:最新版零基础学习 PYTHON 教程(第十七节 - Python 表达式语句–Python返回语句)
    ASP.NET Core自定义中间件的方式
    8款常见的自动化测试开源框架
    C++ PrimerPlus 复习 第六章 分支语句和逻辑运算符
    帆软FineReport决策报表Tab实现方案
    Dubbo的SPI机制
    Efficient Large-Scale Language Model Training on GPU ClustersUsing Megatron-LM
    rabbitMQ死信队列快速编写记录
    Java集合框架源码分析:ArrayList
    界面控件DevExpress WPF的主题设计器,可轻松完成应用主题研发
  • 原文地址:https://blog.csdn.net/m0_62436868/article/details/126282843