1. 内置算法种类
- RoundRobinRule 轮询算法
- RandomRule 随机算法
- AvailabilityFilteringRule
会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,
还有并发的连接数量超过阈值的服务,然后对剩余的服务列表按照轮询策略进行访问 - WeightedResponseTimeRule
根据平均响应时间计算所有服务的权重,响应时间越快服务权重越大被选中的概率越高。
刚启动时如果统计信息不足,则使用RoundRobinRule策略,等统计信息足够,
会切换到WeightedResponseTimeRule - RetryRule
先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试,获取可用的服务 - BestAvailableRule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
- ZoneAvoidanceRule 默认规则,复合判断server所在区域的性能和server的可用性选择服务器,对合规的服务使用线性轮询
2. 更换负载均衡算法
2.1 全局配置
这种配置方式会影响所有的微服务调用
@Configuration
public class RuleConfig {
/**
* 改为随机算法, 全局生效
*
* @return
*/
@Bean
public IRule getRule() {
return new RandomRule();
}
}
2.2 局部配置
2.2.1 外层目录建立个性化配置
在@ComponentScan扫描不到的地方建立配置文件
/**
* Created by rongyaowen
* on 2020/4/2.
* 针对eureka-provider做的ribbon客户端配置
*/
@Configuration
public class EurekaProviderServiceConfig {
@Bean
public IRule getRule() {
return new RandomRule();
}
}
2.2.2 配置方式1
在@ComponentScan扫描目录下建立配置文件
/**
* Created by rongyaowen
* on 2020/3/31.
* ribbon客户端配置
*/
@Configuration
@RibbonClient(name = "eureka-provider", configuration = EurekaProviderServiceConfig.class)
public class RibbonConfig {
}
2.2.3 配置方式2
application.yml中配置
eureka-provider: # 服务名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 表示配置轮询算法
3. 自定义负载均衡算法
实现IRule接口或者实现其子类
/**
* Created by rongyaowen
* on 2020/3/31.
* 只返回第1台主机
*/
public class MyRule extends AbstractLoadBalancerRule {
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
/**
* Randomly choose from all living servers
*/
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) {
/*
* No servers. End regardless of pass, because subsequent passes
* only get more restrictive.
*/
return null;
}
int index = 0;
server = upList.get(index);
if (server == null) {
/*
* The only time this should happen is if the server list were
* somehow trimmed. This is a transient condition. Retry after
* yielding.
*/
Thread.yield();
continue;
}
if (server.isAlive()) {
return (server);
}
// Shouldn't actually happen.. but must be transient or a bug.
server = null;
Thread.yield();
}
return server;
}
public Server choose(Object key) {
return choose(getLoadBalancer(), key);
}
}
根据第二点讲的将其配置上就可以了
本文深入解析了多种内置负载均衡算法,包括轮询、随机、权重响应时间、重试及最佳可用算法,并介绍了如何在微服务架构中全局或局部更换这些算法,同时探讨了自定义负载均衡算法的方法。
533

被折叠的 条评论
为什么被折叠?



