* */ public abstract AbstractServerPredicate getPredicate(); /** * Get a server...by calling {@link AbstractServerPredicate#chooseRandomlyAfterFiltering(java.util.List, Object)}.../com/netflix/loadbalancer/AbstractServerPredicate.java /** * Choose a server in a round robin...()) .build(); } @Override public AbstractServerPredicate getPredicate...loadBalancer.chooseServer方法最后是委托给IRule的choose方法,默认是使用ZoneAvoidanceRule,其内部又委托给AbstractServerPredicate
---- AbstractServerPredicate 它是服务器过滤逻辑的基础组件,可用于rules and server list filters。...完成断言 ---- 静态工具方法 该抽象类提供了三个静态工具方法,用于快速生成一个AbstractServerPredicate实例。...AbstractServerPredicate: public static AbstractServerPredicate alwaysTrue() { return (PredicateKey...AbstractServerPredicate: // 它是轮询算法的实现。...---- 成员属性 public class CompositePredicate extends AbstractServerPredicate { private AbstractServerPredicate
阅读它之前,请你务必已经了解了AbstractServerPredicate的原理,因为它才是核心。...关于断言器AbstractServerPredicate的详解,请参见:[享学Netflix] 四十八、Ribbon服务器过滤逻辑的基础组件:AbstractServerPredicate // 本类为抽象类...public abstract AbstractServerPredicate getPredicate(); @Override public Server choose(Object...()) .build(); } // 实现父类抽象方法 @Override public AbstractServerPredicate...()兜底,以保证至少至少能有一台Server返回,毕竟处理慢总比不处理要好 备注:还是文首那句话,建议请一定先了解AbstractServerPredicate基础过滤组件后再阅读本文,效果更佳
/** * Method that provides an instance of {@link AbstractServerPredicate} to be used by this class...* */ public abstract AbstractServerPredicate getPredicate(); VersionPredicate 我们可以看到PredicateBasedRule...的getPredicate()方法需要返回一个AbstractServerPredicate实例,这个实例具体定义了版本控制的业务逻辑。...代码如下: private static class VersionPredicate extends AbstractServerPredicate { private static final...versionPredicate, availabilityPredicate) .build(); } private static class VersionPredicate extends AbstractServerPredicate
@Slf4j public class MetadataCanaryRuleHandler extends ZoneAvoidanceRule { @Override public AbstractServerPredicate...getPredicate() { return new AbstractServerPredicate() { @Override public...headers); } 然后在路由断言中通过 PredicateKey获取到即可 public abstract class AbstractDiscoveryEnabledPredicate extends AbstractServerPredicate
extends ClientConfigEnabledRoundRobinRule { /** * Method that provides an instance of {@link AbstractServerPredicate...* */ public abstract AbstractServerPredicate getPredicate(); /** *...Get a server by calling {@link AbstractServerPredicate#chooseRandomlyAfterFiltering(java.util.List, Object...ILoadBalancer,然后拿到对应的serverList数据,接着调用chooseRoundRobinAfterFiltering()方法,继续往后跟: public abstract class AbstractServerPredicate
@Slf4j public class MetadataCanaryRuleHandler extends ZoneAvoidanceRule { @Override public AbstractServerPredicate...getPredicate() { return new AbstractServerPredicate() { @Override public
* */ public abstract AbstractServerPredicate getPredicate(); /** *...Get a server by calling {@link AbstractServerPredicate#chooseRandomlyAfterFiltering(java.util.List, Object...return server.get(); } else { return null; } } } AbstractServerPredicate...,最终又回到AbstractServerPredicate的chooseRoundRobinAfterFiltering public Optional chooseRoundRobinAfterFiltering...List result = super.getEligibleServers(servers, loadBalancerKey); IteratorAbstractServerPredicate
public Server choose(Object key) { ILoadBalancer lb = getLoadBalancer(); //这里getPredicate()返回AbstractServerPredicate...server.isPresent()) { return server.get(); } else { return null; } } AbstractServerPredicate...ofKeyPredicate(final Predicate p) { return new AbstractServerPredicate() {...; } else { return false; } } 这2个Predicate是在CompositePredicate的建造者中传入的,代码如下: Builder(AbstractServerPredicate...and(primaryPredicates); toBuild.delegate = AbstractServerPredicate.ofKeyPredicate(
RandomRule <- RetryRule 4.6.1 PredicateBasedRule 基于逻辑断言进行判断是否选择的 Rule, 具体 Predicate 继承如下: Predicate AbstractServerPredicate...loadBalancerKey) { List result = super.getEligibleServers(servers, loadBalancerKey); IteratorAbstractServerPredicate...result.size() > (int) (servers.size() * minimalFilteredPercentage)) && i.hasNext()) { AbstractServerPredicate...result = predicate.getEligibleServers(servers, loadBalancerKey); } return result; } // AbstractServerPredicate...server.isPresent()) { return server.get(); } else { return null; } } // AbstractServerPredicate
PredicateBasedRule:抽象类,提供一个 choose 方法的模板,通过调用 AbstractServerPredicate 实现类的过滤方法来过滤出目标的服务,再通过轮询方法选出一个服务
图1 AvailabilityFilteringRule继承了PredicateBasedRule,这是因为使用到了AbstractServerPredicate.
return server.get(); } else { return null; } } 下面分析"轮询"的过程,AbstractServerPredicate...中获取,"自增取模" return Optional.of(eligible.get(incrementAndGetModulo(eligible.size()))); } AbstractServerPredicate
ContextKey.zone); * } * * @author awang * */ public class ZoneAffinityPredicate extends AbstractServerPredicate
ZoneAvoidanceRule.getAvailableZones()获取可用区的逻辑,参考文章:四十七、Ribbon多区域选择:ZoneAvoidanceRule.getAvailableZones()获取可用区 服务器过滤逻辑组件AbstractServerPredicate...,参考文章:四十八、Ribbon服务器过滤逻辑的基础组件:AbstractServerPredicate ---- DynamicServerListLoadBalancer 它是BaseLoadBalancer
---- 正文 上文有讲到服务列表的断言器:AbstractServerPredicate。...servers; } 说明:次数使用的过滤断言器是ZoneAffinityPredicate,关于它的详解你可以参考这篇文章:[享学Netflix] 四十八、Ribbon服务器过滤逻辑的基础组件:AbstractServerPredicate
getServer() 方法去调用 BaseLoadBalancer.chooseServer 的方法,通过 IRule 实例,进行规则的选择,默认实例是 PredicateBasedRule ,核心执行的话是在 AbstractServerPredicate
servers; } ZoneAffinityPredicate就是检查Zone是否与当前配置中的Zone一致: public class ZoneAffinityPredicate extends AbstractServerPredicate
领取专属 10元无门槛券
手把手带您无忧上云