Spring Cloud学习(四)Ribbon负载均衡服务调用

Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。

1、概述

**负载均衡:**简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的高可用。

  • 集中式LB : 服务的消费和提供方 之间使用独立的lb设施 (可是硬件, nginx ),由改设施负责把访问的请求通过某种策略转发至服务提供方
  • 进程内LB: 将Lb逻辑集成到消费方, 消费方从服务注册中心获得由哪些地址可以用,然后自己在从这些地址中选择一个合适的服务器。

Ribbon能干什么:负载均衡+ RestTemplate调用

2、如何使用

默认我们使用eureka的新版本时,它默认集成了ribbon

Spring Cloud学习(四)Ribbon负载均衡服务调用

RestTemplate类

getForObject方法/getForEntity方法

Spring Cloud学习(四)Ribbon负载均衡服务调用

Ribbon核心组件IRule

IRule:根据特定算法从服务列表中选取一个要访问的服务

Ribbon常用负载均衡算法

Spring Cloud学习(四)Ribbon负载均衡服务调用

默认的负载均衡算法是轮询,那么如何配置其它的负载均衡算法呢?

Spring Cloud学习(四)Ribbon负载均衡服务调用

Spring Cloud学习(四)Ribbon负载均衡服务调用

基于cloud-consumer-order80模块来演示Ribbon

  1. Spring Cloud学习(四)Ribbon负载均衡服务调用

  2. 创建配置类用于指定负载均衡算法

    package com.yu.myrule;
    
    @Configuration
    public class MySelfRule {
    
        @Bean
        public IRule myRule(){
            // 随机
            return new RandomRule();
        }
    }
    
  3. 修改主启动类

Spring Cloud学习(四)Ribbon负载均衡服务调用

如何自己实现一个负载均衡算法

Ribbon轮询算法原理

Spring Cloud学习(四)Ribbon负载均衡服务调用

自定义负载均衡算法
  1. 修改cloud-consumer-order80模块下的配置类Spring Cloud学习(四)Ribbon负载均衡服务调用

  2. 接口实现类

    @Component
    public class MyLB implements LoadBalancer {
    
        private AtomicInteger atomicInteger = new AtomicInteger(0);
    
        /**
         *  while条件:在这个循环条件下,假设有多个线程在同时执行这段代码,
         *  即使有一个线程在产生了新值之后,它还需要让它自己产生的新值与旧值比较之后才能决定要不要这个新值,
         *  如果出现compareAndSet方法的预期值不跟实际值一样,导致方法返回false,直到没有其他线程干扰。这时就确定了新产生的值。
         * @return 接口计数
         */
        public final int getAddIncrement(){
            int current;
            int next;
            do {
                current = this.atomicInteger.get();
                next = current >= 2147483647 ? 0:current+1;
            } while (!this.atomicInteger.compareAndSet(current, next));
            return next;
        }
    
        /**
         *
         * @param serviceInstances 服务
         * @return 真正要调用的服务的下标
         */
        @Override
        public ServiceInstance instances(List<ServiceInstance> serviceInstances) {
            int index = getAddIncrement() % serviceInstances.size();
            return serviceInstances.get(index);
        }
    }
    

    3,修改controller

    Spring Cloud学习(四)Ribbon负载均衡服务调用

    4,修改payment8001和8002模块

      @Value("${server.port}")
        private String serverPort;
    
        @GetMapping(value = "/payment/lb")
        public String getPaymentLb(){
            return serverPort;
        }
    

    5,测试:启动eureka集群,启动提供者8001/8002,启动消费者8090

Spring Cloud学习(四)Ribbon负载均衡服务调用

​ 刷新,端口会改变

Spring Cloud学习(四)Ribbon负载均衡服务调用

上一篇:ribbon源码一


下一篇:spring cloud之ribbon