Spring Cloud+Ribbon自定义负载均衡

上篇文章讲了如何在SpringCloud中接入Ribbon通道
,但是应用的负载均衡策略是默认的轮询策略,如果我们要应用其他测试该如何操作呢?

编码方式实现应用Ribbon提供的规则

先上项目文件组织:
文件组织

1、 编写规则配置类CustomRibbonConfigration

@Configuration
public class CustomRibbonConfigration {
    /**
     * 自定义Ribbon规则
     * @return
     */
    @Bean
    public IRule ribbonRule(){
        return new RandomRule();
    }
}

该类中只是创建了一个IRule的实现类的对象Bean,本例中使用RandomRule来定义随机的规则,默认的是轮询规则,可用的规则实现类有:

  • com.netflix.loadbalancer.RoundRobinRule:轮询规则
  • com.netflix.loadbalancer.AvailabilityFilteringRule:根据服务是否死掉或者服务处于高并发来分配权重
  • com.netflix.loadbalancer.WeightedResponseTimeRule:根据响应时间分配权重
  • com.netflix.loadbalancer.RandomRule:随机规则
  • com.netflix.loadbalancer.ReryRule:重试(先按照轮询规则获取服务,如果获取服务失败则在指定时间内进行重试)
  • com.netflix.loadbalancer.ZoneAvoidanceRule:默认规则,复合判断Server所在区域的性能和Server的可用性选择服务器
  • com.netflix.loadbalancer.BestAvailableRule:先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
    2、 创建Ribbon应用配置类UseCustomRibbonWithProvider
@Configuration
@RibbonClient(name = "${provider.user.appId}",configuration = CustomRibbonConfigration.class)
public class UseCustomRibbonWithProvider {
}

其中 provider.user.appId指定了服务端应用id,configuration指定了我们定义的应用规则配置类。

注意

这里需要说明的是,定义的配置类路径,从文件组织路径可以看出CustomRibbonConfigrationUseCustomRibbonWithProvider并没有放在同一个包下,而且CustomRibbonConfigration单独定义在一个包里,为了避免消费者使用的所有的服务提供者都应用类此负载均衡规则,也可自定义一个注解,然后在Application中使用 ComponentScan指定排除的注解类,具体可见传送门

配置文件方式指定规则

  • 先上配置:
# 使用配置文件方式指定ribbon规则,目前尚未找到通过编码方式直接配置Ribbon
microservice-provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

格式:.ribbon.
其中item有:
NFLoadBalancerClassName:应配置ILoadBalancer
NFLoadBalancerRuleClassName:应配置IRule
NFLoadBalancerPingClassName:应配置IPing
NIWSServerListClassName:应配置ServerList
NIWSServerListFilterClassName:应配置ServerListFilter
clientName表示提供服务的服务id

最后

如果想实现自定一的负载均衡算法,可以实现IRule或者继承 AbstractLoadBalancerRule实现其中的chose方法

你可能感兴趣的:(Spring Cloud+Ribbon自定义负载均衡)