序
ribbon有个参数可以用来调整刷新server list的时间间隔参数。
ServerListRefreshInterval
ribbon-core-2.2.0-sources.jar!/com/netflix/client/config/CommonClientConfigKey.java
public static final IClientConfigKey<Integer> ServerListRefreshInterval = new CommonClientConfigKey<Integer>("ServerListRefreshInterval"){};
PollingServerListUpdater
ribbon-loadbalancer-2.2.0-sources.jar!/com/netflix/loadbalancer/PollingServerListUpdater.java
private static long getRefreshIntervalMs(IClientConfig clientConfig) {
return clientConfig.get(CommonClientConfigKey.ServerListRefreshInterval, LISTOFSERVERS_CACHE_REPEAT_INTERVAL);
}
@Override
public synchronized void start(final UpdateAction updateAction) {
if (isActive.compareAndSet(false, true)) {
final Runnable wrapperRunnable = new Runnable() {
@Override
public void run() {
if (!isActive.get()) {
if (scheduledFuture != null) {
scheduledFuture.cancel(true);
}
return;
}
try {
updateAction.doUpdate();
lastUpdated = System.currentTimeMillis();
} catch (Exception e) {
logger.warn("Failed one update cycle", e);
}
}
};
scheduledFuture = getRefreshExecutor().scheduleWithFixedDelay(
wrapperRunnable,
initialDelayMs,
refreshIntervalMs,
TimeUnit.MILLISECONDS
);
} else {
logger.info("Already active, no-op");
}
}
DynamicServerListLoadBalancer
ribbon-loadbalancer-2.2.0-sources.jar!/com/netflix/loadbalancer/DynamicServerListLoadBalancer.java
protected final ServerListUpdater.UpdateAction updateAction = new ServerListUpdater.UpdateAction() {
@Override
public void doUpdate() {
updateListOfServers();
}
};
@VisibleForTesting
public void updateListOfServers() {
List<T> servers = new ArrayList<T>();
if (serverListImpl != null) {
servers = serverListImpl.getUpdatedListOfServers();
LOGGER.debug("List of Servers for {} obtained from Discovery client: {}",
getIdentifier(), servers);
if (filter != null) {
servers = filter.getFilteredListOfServers(servers);
LOGGER.debug("Filtered List of Servers for {} obtained from Discovery client: {}",
getIdentifier(), servers);
}
}
updateAllServerList(servers);
}
/**
* Update the AllServer list in the LoadBalancer if necessary and enabled
*
* @param ls
*/
protected void updateAllServerList(List<T> ls) {
// other threads might be doing this - in which case, we pass
if (serverListUpdateInProgress.compareAndSet(false, true)) {
for (T s : ls) {
s.setAlive(true); // set so that clients can start using these
// servers right away instead
// of having to wait out the ping cycle.
}
setServersList(ls);
super.forceQuickPing();
serverListUpdateInProgress.set(false);
}
}
这里设置list的时候,顺带调用了forceQuickPing()方法
BaseLoadBalancer#forceQuickPing
ribbon-loadbalancer-2.2.0-sources.jar!/com/netflix/loadbalancer/BaseLoadBalancer.java
/*
* Force an immediate ping, if we're not currently pinging and don't have a
* quick-ping already scheduled.
*/
public void forceQuickPing() {
if (canSkipPing()) {
return;
}
if (logger.isDebugEnabled()) {
logger.debug("LoadBalancer: forceQuickPing invoked");
}
Pinger ping = new Pinger(pingStrategy);
try {
ping.runPinger();
} catch (Throwable t) {
logger.error("Throwable caught while running forceQuickPing() for "
+ name, t);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。