Spring Cloud全解析:负载均衡之Ribbon的负载均衡算法
Ribbon的负载均衡算法
提供的负载均衡算法
Ribbon中有七种负载均衡算法可供选择
-
RoundRobinRule,轮询
-
RandomRule,随机
-
AvailabilityFilteringRule,
会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务(可以通过niws.loadbalancer.<clientName>.connectionFailureCountThreshold来配置连接失败的次数),还有并发的连接数量超过阈值的服务(可以通过<clientName>.ribbon.ActiveConnectionsLimit来配置最高并发数),然后对剩余的服务列表按照轮询策略进行访问
-
WeightedResponseTimeRule,根据平均响应时间计算所有服务的权重,响应时间越快的服务权重越大被选中的概率越高,刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够,会切换到WeightedResponseTimeRule
-
RetryRule,先按照轮询策略获取服务,如果获取服务失败则在指定时间内进行重试,获取可用服务
-
BestAvailableRule,会先过滤掉由于多次访问故障而处于跳闸状态的服务,然后选择一个并发量最小的进行访问
-
ZoneAvoidanceRule,复合判断server所在区域的性能和server的可用性选择
选择负载均衡算法
// 配置restTemplate的负载均衡算法
@Bean
public IRule myRule(){
return new RandomRule();
}
自定义负载均衡算法
/**
* 自定义负载均衡算法
* @author zh
*/
public class MyRule extends AbstractLoadBalancerRule {
Random rand;
public MyRule() {
rand = new Random();
}
// 根据key来选择对应的服务
public Server choose(ILoadBalancer lb, Object key) {
if (lb == null) {
return null;
}
Server server = null;
while (server == null) {
if (Thread.interrupted()) {
return null;
}
// 目前存活的服务
List<Server> upList = lb.getReachableServers();
// 所有的服务
List<Server> allList = lb.getAllServers();
int serverCount = allList.size();
if (serverCount == 0) {
return null;
}
// 生成随机数作为索引获取服务
int index = rand.nextInt(serverCount);
server = upList.get(index);
if (server == null) {
Thread.yield();
continue;
}
if (server.isAlive()) {
return (server);
}
server = null;
Thread.yield();
}
return server;
}
@Override
public Server choose(Object key) {
return choose(getLoadBalancer(), key);
}
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
// TODO Auto-generated method stub
}
}
配置该bean
@Configuration
public class MyRuleConfig {
@Bean
public IRule myRule(){
return new MyRule();
}
}
使用@RibbonClient来使用自定义的负载均衡类,但是这个自定义的负载均衡类不可以在@ComponentScan所能扫描的包下,否则这个自定义的负载均衡算法就会被所有的Ribbon客户端所共享,无法达到对于某个微服务定制的效果了,该bean在使用的时候才会进行实例化
@SpringBootApplication
@EnableEurekaClient
// 配置自定义的负载均衡类,只针对于某个微服务有效
@RibbonClient(name = "micro-service-dept-provider",configuration = MyRule.class)
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class,args);
}
}
除了使用注解,还可以使用配置文件来配置服务使用的ribbon负载均衡算法
micro-service-dept-provider:
ribbon:
NFLoadBalancerRuleClassName: com.zhanghe.ribbon.rule.MyRule
配置格式为<clientName>.ribbon
- NFLoadBalancerClassName 配置ILoadBalancer的实现类
- NFLoadBalancerRuleClassName 配置IRule的实现类
- NFLoadBalancerPingClassName 配置IPing的实现类
- NIWSServerListClassName 配置ServerList的实现类
- NIWSServerListFilterClassName 配置ServerListFilter的实现类
https://zhhll.icu/2021/框架/微服务/springcloud/负载均衡/Ribbon/2.Ribbon的负载均衡算法/