ribbon有個參數能夠用來調整刷新server list的時間間隔參數。java
ribbon-core-2.2.0-sources.jar!/com/netflix/client/config/CommonClientConfigKey.javaapp
public static final IClientConfigKey<Integer> ServerListRefreshInterval = new CommonClientConfigKey<Integer>("ServerListRefreshInterval"){};
ribbon-loadbalancer-2.2.0-sources.jar!/com/netflix/loadbalancer/PollingServerListUpdater.javaide
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"); } }
ribbon-loadbalancer-2.2.0-sources.jar!/com/netflix/loadbalancer/DynamicServerListLoadBalancer.javaui
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()方法this
ribbon-loadbalancer-2.2.0-sources.jar!/com/netflix/loadbalancer/BaseLoadBalancer.javadebug
/* * 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); } }