Ribbon源码PredicateBasedRule解读
程序员文章站
2022-03-15 22:41:00
...
一 PredicateBasedRule在类图中的位置
二 PredicateBasedRule源码解读
//抽象策略,继承自ClientConfigEnabledRoundRobinRule
//基于Predicate的策略
//Predicateshi Google Guava Collection工具对集合进行过滤的条件接口
public abstract class PredicateBasedRule extends ClientConfigEnabledRoundRobinRule {
//定义了一个抽象函数来获取AbstractServerPredicate
public abstract AbstractServerPredicate getPredicate();
@Override
public Server choose(Object key) {
ILoadBalancer lb = getLoadBalancer();
//通过AbstractServerPredicate的chooseRoundRobinAfterFiltering函数来选出具体的服务实例
//AbstractServerPredicate的子类实现的Predicate逻辑来过滤一部分服务实例
//然后在以线性轮询的方式从过滤后的实例中选出一个
Optional<Server> server = getPredicate().chooseRoundRobinAfterFiltering(lb.getAllServers(), key);
if (server.isPresent()) {
return server.get();
} else {
return null;
}
}
}
三 AbstractServerPredicate源码解读
public abstract class AbstractServerPredicate implements Predicate<PredicateKey> {
public Optional<Server> chooseRandomlyAfterFiltering(List<Server> servers) {
//先通过内部定义的getEligibleServers函数来获取备选清单(实现了过滤)
List<Server> eligible = getEligibleServers(servers);
if (eligible.size() == 0) {
//如果返回的清单为空,则用Optional.absent()来表示不存在
return Optional.absent();
}
//以线性轮询的方式从备选清单中获取一个实例
return Optional.of(eligible.get(random.nextInt(eligible.size())));
}
public List<Server> getEligibleServers(List<Server> servers) {
return getEligibleServers(servers, null);
}
/**
* Get servers filtered by this predicate from list of servers.
*/
public List<Server> getEligibleServers(List<Server> servers, Object loadBalancerKey) {
if (loadBalancerKey == null) {
return ImmutableList.copyOf(Iterables.filter(servers, this.getServerOnlyPredicate()));
} else {
List<Server> results = Lists.newArrayList();
//遍历服务清单,使用apply方法来判断实例是否需要保留,如果是,就添加到结果列表中
//所以apply方法需要在子类中实现,子类就可实现高级策略
for (Server server: servers) {
if (this.apply(new PredicateKey(loadBalancerKey, server))) {
results.add(server);
}
}
return results;
}
}
}
上一篇: Java基础之入门
下一篇: 带权并查集(hdoj 3038)
推荐阅读
-
PHP网页游戏学习之Xnova(ogame)源码解读(二)_PHP教程
-
PHP网页游戏学习之Xnova(ogame)源码解读(十六)_PHP教程
-
ArrayList源码解读
-
YYText源码解读-YYText同步/异步渲染流程(一)—UIView与CALayer
-
YYText源码解读-YYText同步/异步渲染流程(二)
-
基于线程池的工作原理与源码解读
-
Android View源码解读 DecorView与ViewRootImpl浅谈
-
基于线程池的工作原理与源码解读
-
Android View源码解读 DecorView与ViewRootImpl浅谈
-
PHP网页游戏学习之Xnova(ogame)源码解读(十三)