Version: Next

Ribbon 负载均衡

Ribbon 中定义了一个 IRule 接口

package com.netflix.loadbalancer;
public interface IRule {
Server choose(Object var1);
void setLoadBalancer(ILoadBalancer var1);
ILoadBalancer getLoadBalancer();
}

显然,其用来选择具体的负载均衡策略


Ribbon 自带负载均衡策略

IRule 在 Ribbon 中存在的 7 个实现类:

实现类负载均衡策略
com.netfix.loadbalancer.RoundRobinRule轮询
com.netfix.loadbalancer.RandomRule随机
com.netfix.loadbalancer.RetryRule先按照 轮询 获取服务,如果获取服务失败则在指定时间内进行重试,获取可用服务
WeightedResponseTimeRule轮询 的扩展,响应速度越快的实例选择去那种越大,越容易被选择
BestAvailableRule会先过滤掉由于多次访问故障从而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
AvailabilityFilteringRule先过滤掉故障实例,再选择并发较小的实例
ZoneAvoidanceRule复合判断 server 所在区域的性能和 server 的可用性选择服务器

更改负载均衡策略

注意

自定义配置类不能放在 @ComponentScan 所扫描的当前包及其子包下,否则自定义配置会被所有 Ribbon 客户端共享,达不到特殊化定制的目的

提示

先恢复环境

  • 使用 Eureka 作为服务注册中心,恢复为 Eureka Server 集群,开启保护模式,恢复默认心跳时间,超时时间
  • 80018002 都注册到注册中心

在SpringBoot中,默认 @ComponentScan 扫的就是 主启动类 所在的包及其子包,因此,要跳到主启动类所在包外面去建一个新包

order80 新建 com.bsx.myrule

  • 新建 MySelfRule 负载均衡规则类,其实一个 Spring 配置类

    /**
    * 自定义 Ribbon 负载均衡规则
    */
    @Configuration
    public class MySelfRule {
    @Bean
    public IRule myRule() {
    return new RandomRule(); // 随机节点策略
    }
    }
  • 在主启动类添加 @RibbonClient 注解

    • nameCLOUD-PAYMENT-SERVICE,Eureka Server 中的服务名
    • configuration:填写自定义负载均衡策略类 MySelfRule.class
    @SpringBootApplication
    @EnableEurekaClient
    @RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)
    public class OrderMain80 {
    public static void main(String[] args) {
    SpringApplication.run(OrderMain80.class, args);
    }
    }

此时,多次访问 http://127.0.0.1:80/consumer/payment/get/2,会发现端口号随机变化