【Ribbon】负载均衡学习记录

什么是Ribbon?

 Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端实现负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中Load Balancer后面的所有机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法。


负载均衡的流程图

【Ribbon】负载均衡学习记录_第1张图片

 负载均衡流程图【Ribbon】负载均衡学习记录_第2张图片

 负载均衡原理图

基本流程如下:

  1. LoadBalancerIntercepor拦截器拦截我们的RestTemplate请求http://userservice/user/1
  2. RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
  3. DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表
  4. eureka返回列表,localhost:8081、localhost:8082
  5. IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081
  6. RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求
     

负载均衡的算法


轮询:

  • 将所有请求,依次分发到每台服务器上,适合服务器硬件同相同的场景。
  • 优点:服务器请求数目相同;
  • 缺点:服务器压力不一样,不适合服务器配置不同的情况;


随机:

  • 请求随机分配到各个服务器。
  • 优点:使用简单;
  • 缺点:不适合机器配置不同的场景;


最少链接:

  • 将请求分配到连接数最少的服务器(目前处理请求最少的服务器)。
  • 优点:根据服务器当前的请求处理情况,动态分配;
  • 缺点:算法实现相对复杂,需要监控服务器请求连接数;


Hash(源地址散列):

  • 根据IP地址进行Hash计算,得到IP地址。
  • 优点:将来自同一IP地址的请求,同一会话期内,转发到相同的服务器;实现会话粘滞。
  • 缺点:目标服务器宕机后,会话会丢失;


加权:

  • 在轮询,随机,最少链接,Hash等算法的基础上,通过加权的方式,进行负载服务器分配。
  • 优点:根据权重,调节转发服务器的请求数目;
  • 缺点:使用相对复杂;

Ribbon用来负载均衡的策略

【Ribbon】负载均衡学习记录_第3张图片

 默认 RoundRobinRule 简单轮询策略


如何更改负载均衡策略

导入pom文件



     com.netflix.ribbon
     ribbon-loadbalancer
     2.3.0


     org.springframework.cloud
     spring-cloud-starter-ribbon

第一种:创建配置类

注意:不能写在@SpringbootApplication注解的@CompentScan扫描得到的地方,否则自定义的配置类就会被所有的RibbonClients共享。

【Ribbon】负载均衡学习记录_第4张图片

单独创建一个module用作负载均衡,取名ribbon

第一步:创建配置类

/**
 * @author XiaoSuDa
 * @description: 更改负载均衡策略$
 */
@Configuration
public class RibbonRandomRuleConfig {
    //方法名一定要叫iRule
    @Bean
    public IRule iRule(){
        return new RandomRule();  //更改为随机选择服务器
    }
}

 第二步:修改启动类


@SpringBootApplication
@EnableEurekaClient
//name属性是服务名,取配置文件的spring.application.name的值,configuration属性是指该服务的负载均衡机制为该配置类修改的负载均衡机制
//表示stock-service服务实例使用RibbonRandomRuleConfig配置类配置的负载均衡机制,这里是随机机制
@RibbonClients(value = {
        @RibbonClient(name = "cloud-client",configuration = RibbonRandomRuleConfig.class),
        @RibbonClient(name = "cloud-providers",configuration =RibbonRandomRuleConfig.class)
})
public class DemoApplication {

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

    @Bean
    @LoadBalanced //负载均衡
    /**
     * 默认的负载均衡机制采用的类似轮询的这种均衡机制
     */
    public RestTemplate restTemplate(RestTemplateBuilder builder){
        //spring官网建议RestTemplateBuilder构造器来进行构造,这里体现了构造者设计模式
        return builder.build();
    }
}
@RibbonClient注解中,name为eureka注册中心的实例名字,configuration为配置类名字,如果需要配置多个负载均衡,则选择 @RibbonClients 注解

第三步:修改yml文件,将ribbon服务注册到eureka

server:
  port: 8084

spring:
  application:
    name: ribbon

eureka:
  client:
    service-url:
      defaultZone:  http://localhost:8080/eureka
  instance:
    hostname: 127.0.0.1
    prefer-ip-address: true
    instance-id: 127.0.0.1:8084

第二种:修改yml文件

cloud-providers: #提供者应用名,取提供者配置文件的spring.application.name的值
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #随机负载均衡策略

Ribbon饥饿加载

Ribbon默认懒汉加载,第一次加载速度很慢,更改为饥饿加载,可以提高第一次加载速度

修改方法:修改yml文件

ribbon:
  eager-load:
    enabled: true #开启饥饿加载
    clients:  #指定Eureka服务实例名称
      - cloud-providers
      - cloud-client

你可能感兴趣的:(Ribbon,ribbon,负载均衡,学习)