目录

一、Ribbon概述

二、负载均衡

三、负载均衡流程

​ 四、负载均衡策略

1、RoundRobinRule:​

2、AvailabilityFilterRule​

3、WeightedResponseTimeRule ​

4、ZoneAvoidanceRule​

5、BestAvailableRule​ 

6、RandomRule ​

7、RetryRule ​

 五、代码实操

1、maven导入

2、代码方式修改

3、配置文件修改

4、饥饿加载


一、Ribbon概述

Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现,通过Spring Cloud Ribbon的封装,在微服务架构中使用客户端负载均衡调用非常简单。Ribbon是Spring Cloud整个大家庭中相对而言比较复杂的模块,直接影响到服务调度的质量和性能。

二、负载均衡

  • 服务端负载均衡,又分为硬件负载均衡(比如F5)、软件负载均衡(比如Nginx)
  • 客户端负载均衡(比如Ribbon)

(1)服务端负载均衡:维护一个可用的服务端清单,通过心跳检测来剔除故障的服务端节点,保证清单中都是可正常访问的服务端节点。当客户端发送请求到负载均衡设备的时候,该设备按某种算法(轮询、加权等)从维护的可用服务端清单中取出一台服务端端地址,然后进行转发。

(2)客户端负载均衡:和服务端负载均衡最大的不同点在于服务清单所存储的位置。在客户端负载均衡中,所有客户端节点都维护着自己要访问的服务端清单,而这些服务端端清单来自于服务注册中心。

三、负载均衡流程

 四、负载均衡策略

 内置负载均衡规则类&规则描述

1、RoundRobinRule:

         简单轮询服务列表来选择服务器,它是Ribbon默认的负载均衡策略

2、AvailabilityFilterRule

         对以下两种服务器进行忽略:

  • (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态,短路状态将持续30秒,如果再次连接失败,短路持续时间就会几何级地增加。
  • (2)并发数过高的服务器,如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的ActiveConnectionsLimit进行配置。

3、WeightedResponseTimeRule 

        为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重会影响服务器的选择。 

4、ZoneAvoidanceRule

        以区域可用的服务器为基础进行服务器的选择,使用Zone对服务器进行分类,这个Zone可用理解为一个机房,一个机架等。而后再对Zone内对多个服务做轮询。

5、BestAvailableRule 

         忽略那些短路等服务器,并选择并发数较低的服务器

6、RandomRule 

         随机选择一个可用的服务器

7、RetryRule 

         重试机制的选择逻辑

 五、代码实操

1、maven导入

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>

//--------------springcloud-H版引入eureka-client自带ribbon-----------------------//
 <!--eureka client-->
  <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

2、代码方式修改

  •  方法1:在启动类Application中添加Bean加载信息

    @Bean
    public IRule randomRule(){
        return new RandomRule();
    }
  •       方法二:(1)创建配置类
    package com.cloud.order.config;
    
    import com.netflix.loadbalancer.IRule;
    import com.netflix.loadbalancer.RandomRule;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * @author :jizhibing
     * @date :Created in 2022/4/18
     * @description:Ribbon规则替换类
     */
    @Configuration
    public class MyRule {
    
        @Bean
        public IRule randomRule(){
            //替换为随机算法
            return new RandomRule();
        }
    
    }
    

    (2)在启动类上边加上:

            @RibbonClient(name ="服务名" ,configuration = RibbonConfig.class)

package com.cloud.order;

import com.cloud.order.config.MyRule;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@MapperScan("com.cloud.order.mapper")
@SpringBootApplication
@RibbonClient(value = "服务名",configuration = MyRule.class) //指定具体的负载均衡替换类和key
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
  
}

3、配置文件修改

userservice:
  ribbon:
    NFLoadBanlancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡规则

4、饥饿加载

        Ribbon默认的是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长。而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载。

        

ribbon:
  eager-load:
    enabled: true #开启饥饿加载
    clients: userservice   #制定对userservice这个服务饥饿加载

代码资源下载:
https://pan.baidu.com/s/169SFtYEvel44hRJhmFTRTQ
提取码:1234