内置负载均衡规则
负载均衡规则是Ribbon的核心,下面来看一下Ribbon内置的负载均衡规则。
- RandomRule:随机选择;
- RoundRobinRule:轮询选择;
- BestAvailableRule:会先过滤掉由于多次访问故障二处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
- WeightedResponseTimeRule:根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大
- RetryRule:先按照RoundRobinRule策略获取服务,如果获取服务失败会在指定时间内重试
- AvailabilityFilteringRule:会先过滤由于多次访问故障而处于断路器跳闸的状态的服务和并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略
- ZoneAvoidanceRule:默认规则,复合判断server所在的区域的性能和server的可用性选择服务器
Ribbon负责策略-全局配置
将ribbon全局的策略改成随机(也可以使用编码的方式,比较麻烦故不做介绍)
修改application.properties配置文件
ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
Ribbon负责策略-模块配置
在一些的业务使用场景中,我们可以需要针对不同的服务使用不同的负载策略,例如我们的服务调用外部服务server1和服务server2,我们希望在调用服务server1的时候使用RandomRule,在调用服务server2的时候使用RoundRobinRule
使用配置的方式(
server1.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
server2.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule
Ribbon负载策略-自定义
如果需要使用自定义的负载算法的时候,可以使用@Configuration 注解和@RibbonClient 注解
第一步:自定义复杂算法
创建自定义算法类RandomRule_ZY,并继承AbstractLoadBalancerRule,重写choose方式
// 获取存活的服务,选择第一个返回
public class RandomRule_ZY extends AbstractLoadBalancerRule{
@Override
public Server choose(Object key) {
ILoadBalancer lb = getLoadBalancer();
List upList = lb.getReachableServers();
return upList.get(0)
}
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
}
}
第二步:创建Ribbon的配置类。
/**
* 该类为Ribbon的配置类
* 注意:该类如果放在主应用程序上下文@ComponentScan所扫描的包中,则配置将会被所有Ribbon Client共享。
*/
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule() {
// 负载均衡规则,改为自定义规则
return new MySelfRule();
}
}
第三步:指定需要使用自定义负载算法的服务
创建Configuration 类使用@Configuration 注解和@RibbonClient 注解
/**
* 使用RibbonClient,为特定的目标服务自定义配置。
* 使用@RibbonClient的configuration属性,指定Ribbon的配置类。
*/
@Configuration
@RibbonClient(name = "server1", configuration = RibbonConfiguration.class)
public class Configuration {
}
注意:Ribbon是懒加载的——首次请求Ribbon相关类才会初始化,这会导致首次请求过慢的问题,你可以配置饥饿加载,让Ribbon在应用启动时就初始化。ribbon.eager-load.enabled=true