本篇文章给大家分享的是有关Ribbon中AvailabilityFilteringRule的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
Ribbon的版本是2.3.0.release.
图1
AvailabilityFilteringRule继承了PredicateBasedRule,这是因为使用到了AbstractServerPredicate.
choose方法如下List-1, 轮循选一个,判读是否满足条件,如果满足则返回,超过10次,则调用父类的choose方法选择.
List-1
public Server choose(Object key) { int count = 0; for(Server server = this.roundRobinRule.choose(key); count++ <= 10; server = this.roundRobinRule.choose(key)) { if (this.predicate.apply(new PredicateKey(server))) { return server; } } return super.choose(key); }
来看AvailabilityPredicate,如下List-2, apply方法返回true,需要满足俩个条件,断路器闭合,调用服务的并发请求数小于限制数
List-2
public boolean apply(@Nullable PredicateKey input) { LoadBalancerStats stats = this.getLBStats(); if (stats == null) { return true; } else { return !this.shouldSkipServer(stats.getSingleServerStat(input.getServer())); } } private boolean shouldSkipServer(ServerStats stats) { return CIRCUIT_BREAKER_FILTERING.get() && stats.isCircuitBreakerTripped() || stats.getActiveRequestsCount() >= (Integer)this.activeConnectionsLimit.get(); }
List-1中10次之后还不满足,则调用父类的choose方法,来看下PredicateBasedRule的choose实现,如下List-3
List-3
public Server choose(Object key) { ILoadBalancer lb = this.getLoadBalancer(); Optional<Server> server = this.getPredicate().chooseRoundRobinAfterFiltering(lb.getAllServers(), key); return server.isPresent() ? (Server)server.get() : null; }
chooseRoundRobinAfterFiltering中是如何实现的呢,如下List-4,
获取所有的服务实例
遍历服务列表,过滤掉不满足条件的
在满足条件的服务列表中,再进行RoundRibbon算法,选出服务
List-4
public Optional<Server> chooseRoundRobinAfterFiltering(List<Server> servers, Object loadBalancerKey) { List<Server> eligible = this.getEligibleServers(servers, loadBalancerKey); return eligible.size() == 0 ? Optional.absent() : Optional.of(eligible.get(this.incrementAndGetModulo(eligible.size()))); } 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(); Iterator var4 = servers.iterator(); while(var4.hasNext()) { Server server = (Server)var4.next(); if (this.apply(new PredicateKey(loadBalancerKey, server))) { results.add(server); } } return results; } }
AvailabilityFilteringRule在RoundRibbon的基础上,选择满足条件的服务,如果10次了还没得到,则在满足条件的服务列表中,再用RoundRibbon算法选择.
以上就是Ribbon中AvailabilityFilteringRule的作用是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。