一、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 |
ILoadBalancer | Ribbon的入口 | 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 { } 复制代码
讲解我们这里配置类并没有增加配置类注解
如果放到springboot能扫描的地方就会成为全局配置文件。对所有的调用都会用这个规则。
2、属性配置方式
将前面的配置注释掉:
如下进行配置:
msb-stock: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule 复制代码
3、优先级高低
java配置的要高, 我们可以类配置的路由规则为随机(RandomRule),然后属性配置为轮训(RoundRobinRule);
测试是随机则java配置高于属性配置
4、全局配置
◆方式一︰让ComponentScan上下文重叠(强烈不建议使用)
◆方式二【唯正确的途径】: @RibbonClients(defaultConfiguration=xxx.class)
就是将RibbonClient改为RibbonClients 将configuration改为defaultConfiguration