Spring Cloud Alibaba-Ribbon的负载均衡和细粒度配置自定义

562 阅读3分钟

一、Ribbon的重要接口 以及内置负载均衡规则

1、Ribbon重要接口

接口作用默认值
IClientConfig读取配置DefaultclientConfigImpl
IRule负载均衡规则,选择实例ZoneAvoidanceRule
IPing筛选掉ping不通的实例默认采用DummyPing实现,该检查策略是一个特殊的实现,<br />实际上它并不会检查实例是否可用,而是始终返回true,默认认为所<br />有服务实例都是可用的.
ServerList<Server>交给Ribbon的实例列表Ribbon: ConfigurationBasedServerList<br /> Spring Cloud Alibaba: NacosServerList
ServerListFilter过滤掉不符合条件的实例ZonePreferenceServerListFilter
ILoadBalancerRibbon的入口ZoneAwareLoadBalancer
ServerListUpdater更新交给Ribbon的List的策略PollingServerListUpdater

2、Ribbon负载均衡规则

我们说一下常用的规则

规则名称特点
RandomRule随机选择一个Server
NacosRule同集群优先调用
RetryRule对选定的负责均衡策略机上充值机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的Server
RoundRobinRule轮询选择,轮询index,选择index对应位置Server
WeightedResponseTimeRule根据相应时间加权,相应时间越长,权重越小,被选中的可能性越低
ZoneAvoidanceRule(默认是这个)该策略能够在多区域环境下选出最佳区域的实例进行访问。在没有Zone的环境下,类似于轮询(RoundRobinRule)

二、细粒度配置自定义

ribbon支持非常灵活的配置,用的最多的就是配置他的负载均衡规则,比如:默认ZoneAvoidanceRule 满足不了我们的要求,我们想把这个规则改为随机,ribbon支持细粒度的配置,加入内容中心同时调用两个微服务,那么调用第一个微服务的时候我们可以用随机方式,第二种我们用默认的配置,好这样我们围着这个场景来看一下怎样配置。

先看Java代码的配置。

1、类配置方式

这里的配置类需要放到springboot扫描路径之外,这个需要注意的点。

public class RibbonConfiguration {
    @Bean
    public IRule ribbonRule(){
        //随机选择
        return new RandomRule();
    }
}
/**
* 指定配置
**/
@Configuration
@RibbonClient(name = "nx-user",configuration = RibbonConfiguration.class)
public class UserRibbonConfiguration {
}

image.png

讲解我们这里配置类并没有增加配置类注解

如果放到springboot能扫描的地方就会成为全局配置文件。对所有的调用都会用这个规则。

2、属性配置方式

将前面的配置注释掉:

如下进行配置:

msb-stock:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

3、优先级高低

java配置的要高, 我们可以类配置的路由规则为随机(RandomRule),然后属性配置为轮训(RoundRobinRule);

测试是随机则java配置高于属性配置

4、全局配置

◆方式一︰让ComponentScan上下文重叠(强烈不建议使用

image.png

◆方式二【唯正确的途径】: @RibbonClients(defaultConfiguration=xxx.class)

就是将RibbonClient改为RibbonClients 将configuration改为defaultConfiguration

image.png

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情