BaseLoadBalancer 在Ribbon中起着至关重要的作用,在该类中定义了很多关于负载均衡器相关的基础内容。ZoneAwareLoadBalancer和DynamicServerListLoadBalancer都是 BaseLoadBalancer 的子类。
在一个应用中: 一个服务名 对应 一个 ILoadBalancer.
均衡负载器
PingTask
BaseLoadBalancer 在初始化时,会调用一个 setupPingTask().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| protected Timer lbTimer = null;
void setupPingTask() { if (canSkipPing()) { return; } if (lbTimer != null) { lbTimer.cancel(); } lbTimer = new ShutdownEnabledTimer("NFLoadBalancer-PingTimer-" + name, true); lbTimer.schedule(new PingTask(), 0, pingIntervalSeconds * 1000); forceQuickPing(); }
|
PingTask 仅仅负责实例的状态信息,没有能力 进行 服务列表的增删。
BaseLoadBalancer
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| public class BaseLoadBalancer extends AbstractLoadBalancer implements PrimeConnections.PrimeConnectionListener, IClientConfigAware { private final static IRule DEFAULT_RULE = new RoundRobinRule(); protected IRule rule = DEFAULT_RULE; protected IPingStrategy pingStrategy = DEFAULT_PING_STRATEGY; protected IPing ping = null;
public Server chooseServer(Object key) { if (counter == null) { counter = createCounter(); } counter.increment(); if (rule == null) { return null; } else { try { return rule.choose(key); } catch (Exception e) { logger.warn("LoadBalancer [{}]: Error choosing server for key {}", name, key, e); return null; } } } }
|
Spring Cloud Ribbon 源码分析