Ribbon作为一款客户端负载均衡框架,默认的负载策略是轮询,除轮询外,它还提供了其它策略,能够让用户根据自身业务需求进行选择。
BestAvailableRule:选择一个最小的并发请求的Server,逐个考察Server,如果Server被标记为错误,则跳过,然后再选择ActiveRequestCount中最小的Server;
AvailabilityFilteringRule:过滤掉那些一直连接失败的且被标记为circuit tripped的后端Server,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤Server的逻辑。其实就是检查Status里记录的各个Server的运行状态;
ZoneAvoidanceRule:使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个Server,前一个判断判定一个Zone的运行性能是否可用,剔除不可用的Zone,AvailabilityPredicate用于过滤掉连接数过多的Server;
RandomRule:随机选择一个Server;
RoundRobinRule:轮询查询,轮询index,选择index对应位置的Server;
RetryRule:对选定的负载均衡策略机上重试机制,也就是说当选定了某个策略进行请求负载时,在一个配置的时间段内若选择的Server不成功,则一直尝试使用subRule的方式选择一个可用的Server;
ResponseTimeWeightedRule:(WeightedResponseTimeRule)根据响应时间分配一个Weight(权重),响应时间越长,Weight越小,被选中的可能性越低。ResponseTimeWeightedRule后来被命名为WeightedResponseTimeRule
通过实现IRule接口可以自定义负载策略,主要的选择服务逻辑在choose方法中。下面只演示怎么自定义负载策略,没写选择的逻辑,直接返回服务列表中第一个服务,代码如下:
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server;
import java.util.List;
/**
* 自定义Ribbon负载均衡
*/
public class MyRule implements IRule {
private ILoadBalancer lb;
@Override
public Server choose(Object key) {
List<Server> servers = lb.getAllServers();
for (Server server:servers){
System.out.println(server.getHostPort());
}
return servers.get(0);
}
@Override
public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
this.lb = iLoadBalancer;
}
@Override
public ILoadBalancer getLoadBalancer() {
return lb;
}
}
在SpringCloud中,可通过配置的方式使用自定义的负载均衡。
smile-eureka-client:
ribbon.NFLoadBalancerRuleClassName: com.smile.ribbonnativedemo.config.MyRule
其中,smile-eureka-client是要调用的服务名称,com.smile.ribbonnativedemo.config.MyRule是自定义负载均衡实现类的路径。