diff --git a/spring-cloud-kubernetes-config/src/main/java/org/springframework/cloud/kubernetes/config/reload/ConfigReloadAutoConfiguration.java b/spring-cloud-kubernetes-config/src/main/java/org/springframework/cloud/kubernetes/config/reload/ConfigReloadAutoConfiguration.java index b811f827..55928328 100644 --- a/spring-cloud-kubernetes-config/src/main/java/org/springframework/cloud/kubernetes/config/reload/ConfigReloadAutoConfiguration.java +++ b/spring-cloud-kubernetes-config/src/main/java/org/springframework/cloud/kubernetes/config/reload/ConfigReloadAutoConfiguration.java @@ -16,6 +16,8 @@ package org.springframework.cloud.kubernetes.config.reload; +import java.util.concurrent.ThreadLocalRandom; + import io.fabric8.kubernetes.client.KubernetesClient; import org.springframework.beans.factory.annotation.Autowired; @@ -114,18 +116,34 @@ public class ConfigReloadAutoConfiguration { switch (properties.getStrategy()) { case RESTART_CONTEXT: return new ConfigurationUpdateStrategy(properties.getStrategy().name(), - restarter::restart); + () -> { + wait(properties); + restarter.restart(); + }); case REFRESH: return new ConfigurationUpdateStrategy(properties.getStrategy().name(), refresher::refresh); case SHUTDOWN: return new ConfigurationUpdateStrategy(properties.getStrategy().name(), - ctx::close); + () -> { + wait(properties); + ctx.close(); + }); } throw new IllegalStateException("Unsupported configuration update strategy: " + properties.getStrategy()); } + private static void wait(ConfigReloadProperties properties) { + final long waitMillis = ThreadLocalRandom.current() + .nextLong(properties.getMaxWaitForRestart().toMillis()); + try { + Thread.sleep(waitMillis); + } + catch (InterruptedException ignored) { + } + } + } } diff --git a/spring-cloud-kubernetes-config/src/main/java/org/springframework/cloud/kubernetes/config/reload/ConfigReloadProperties.java b/spring-cloud-kubernetes-config/src/main/java/org/springframework/cloud/kubernetes/config/reload/ConfigReloadProperties.java index 8a8ce1ff..b89c4ad5 100644 --- a/spring-cloud-kubernetes-config/src/main/java/org/springframework/cloud/kubernetes/config/reload/ConfigReloadProperties.java +++ b/spring-cloud-kubernetes-config/src/main/java/org/springframework/cloud/kubernetes/config/reload/ConfigReloadProperties.java @@ -58,6 +58,16 @@ public class ConfigReloadProperties { */ private Duration period = Duration.ofMillis(15000L); + /** + * If Restart or Shutdown strategies are used, Spring Cloud Kubernetes waits a random + * amount of time before restarting. This is done in order to avoid having all + * instances of the same application restart at the same time. This property + * configures the maximum of amount of wait time from the moment the signal is + * received that a restart is needed until the moment the restart is actually + * triggered + */ + private Duration maxWaitForRestart = Duration.ofSeconds(2); + public ConfigReloadProperties() { } @@ -109,6 +119,14 @@ public class ConfigReloadProperties { this.period = period; } + public Duration getMaxWaitForRestart() { + return maxWaitForRestart; + } + + public void setMaxWaitForRestart(Duration maxWaitForRestart) { + this.maxWaitForRestart = maxWaitForRestart; + } + /** * Reload strategies. */