其他分享
首页 > 其他分享> > SpringCloud-2.0-周阳(8. 负载均衡 - Ribbon)学习笔记

SpringCloud-2.0-周阳(8. 负载均衡 - Ribbon)学习笔记

作者:互联网

上一篇 :7. 服务注册发现 - Consul

文章目录

1. 概述

1.1 Ribbon 是什么

在这里插入图片描述

1.2 负载均衡(LB)

Ribbon 就属于进程内 LB ,它只是一个类库,集成与消费者进程,消费者通过他来获取到服务提供者的地址

1.3 架构说明

  • 第一步 :先选择 Eureka Server ,它优先选择在同一个区域内负载较少的 Server。
  • 第二步 :再根据用户指定的策略,再从 Server 取到的服务注册列表中 选择一个地址

2. 使用

2.1 RestTemplate 的使用

  1. Ribbon 依赖

    新版的 Eureka 会自动把 Ribbon 也一起导入,所以不需要额外引入依赖

    在这里插入图片描述

  2. getForObject / getForEntity 的使用

  1. postForObject / postForEntity 的使用

2.2 负载均衡组件 - IRule

实现类策略
com.netflix.loadbalancer.RoundRobinRule轮询(默认)
com.netflix.loadbalancer.RandomRule随机
com.netflix.loadbalancer.RetryRule先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试
WeightedResponseTimeRule对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
BestAvailableRule会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
AvailabilityFilteringRule先过滤掉故障实例,再选择并发较小的实例
ZoneAvoidanceRule复合判断server所在区域的性能和server的可用性选择服务器
  1. 修改 cloud-consumer-order-80 模块

  2. 注意

    这个配置负载均衡的类 不能在主应用程序的上下文(也就是 主启动类的同级目录中),所以需要单独的创建一个包

  3. 新建一个包 myRule
    在这里插入图片描述

  4. 新建一个规则类 :MyRule

    @Configuration
    public class MySelfRule {
        @Bean
        public IRule myRule(){
            return new RandomRule();//定义为随机
        }
    }
    
  5. 主启动类添加 @RibbonClient

    @EnableEurekaClient
    @SpringBootApplication
    @RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)
    public class OrderMain80 {
        public static void main(String[] args) {
            SpringApplication.run(OrderMain80.class, args);
        }
    }
    
  6. 测试

    启动两个 Provider ,一直发出查询请求,会在 8001、8002 随机选择

2.3 轮询原理

2.4 自定义一个负载均衡策略

  1. ApplicationContextBean去掉@LoadBalanced
    在这里插入图片描述

  2. 在 8001、8002 的 Controller 中添加一个方法

    /** 用于测试自定义负载均衡 */
    @GetMapping(value = "/payment/lb")
    public String getPaymentLB(){
        return serverPort;
    }
    
  3. 新建一个 lb 的包,并在该包下建一个接口:LoadBalancer
    在这里插入图片描述

    public interface LoadBalancer {
        /** 收集服务器总共有多少台能够提供服务的机器,并放到list里面 */
        ServiceInstance instances(List<ServiceInstance> serviceInstances);
    }
    
  4. 为上面的接口写一个实现类

    @Component
    public class MyLB implements LoadBalancer {
    
        // 用于统计当前的访问次数
        private AtomicInteger atomicInteger = new AtomicInteger(0);
    
        /**
         * @return 当前是第几次访问
         */
        public final int getAndIncrement(){
            int current, next;
            // 自旋锁
            do {
                current = this.atomicInteger.get();
                next = current >= 2147483647 ? 0 : current + 1;
            }while (!this.atomicInteger.compareAndSet(current, next));
            System.out.println("【 当前访问次数 】 next = :"+next);
            return next;
        }
    
        @Override
        public ServiceInstance instances(List<ServiceInstance> serviceInstances) {
            // 通过取余,计算出当前应该是哪一个 Provider 提供服务
            int index = getAndIncrement() % serviceInstances.size();
            ServiceInstance instance = serviceInstances.get(index);
            System.out.println("当前是 【" + instance.getUri() + "】 提供服务");
            return instance;
        }
    }
    
  5. 修改 cloud-consumer-order-80 的 Controller

    /** 引入 自定义 的 LB */
    @Autowired
    private LoadBalancer loadBalancer;
    
    @Autowired
    private DiscoveryClient discoveryClient;
    
    /** 用于测试自定义负载均衡 */
    @GetMapping(value = "/payment/lb")
    public String getPaymentLB(){
        // 根据 ServiceId 获取 Server 集合
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        // 如果没有服务
        if (instances == null || instances.size() <= 0){
            return null;
        }
        
        // 获取 Server 实例
        ServiceInstance serviceInstance = loadBalancer.instances(instances);
        // 通过实例获得该实例的 地址
        URI uri = serviceInstance.getUri();
        return restTemplate.getForObject(uri+"/provider/payment/lb",String.class);
    }
    
  6. 启动项目测试自己的轮询

    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

标签:负载,return,周阳,entity,均衡,SpringCloud,2.0,public,Ribbon
来源: https://blog.csdn.net/weixin_44449838/article/details/110496603