Refactor eager-load PR. Add docs.
This commit is contained in:
@@ -31,6 +31,7 @@
|
||||
|spring.cloud.loadbalancer.cache.ttl | `+++35s+++` | Time To Live - time counted from writing of the record, after which cache entries are expired, expressed as a {@link Duration}. The property {@link String} has to be in keeping with the appropriate syntax as specified in Spring Boot <code>StringToDurationConverter</code>. @see <a href= "https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/convert/StringToDurationConverter.java">StringToDurationConverter.java</a>
|
||||
|spring.cloud.loadbalancer.clients | |
|
||||
|spring.cloud.loadbalancer.configurations | `+++default+++` | Enables a predefined LoadBalancer configuration.
|
||||
|spring.cloud.loadbalancer.eager-load.clients | | Names of the clients.
|
||||
|spring.cloud.loadbalancer.enabled | `+++true+++` | Enables Spring Cloud LoadBalancer.
|
||||
|spring.cloud.loadbalancer.health-check.initial-delay | `+++0+++` | Initial delay value for the HealthCheck scheduler.
|
||||
|spring.cloud.loadbalancer.health-check.interval | `+++25s+++` | Interval for rerunning the HealthCheck scheduler.
|
||||
@@ -59,8 +60,6 @@
|
||||
|spring.cloud.loadbalancer.sticky-session.instance-id-cookie-name | `+++sc-lb-instance-id+++` | The name of the cookie holding the preferred instance id.
|
||||
|spring.cloud.loadbalancer.x-forwarded.enabled | `+++false+++` | To Enable X-Forwarded Headers.
|
||||
|spring.cloud.loadbalancer.zone | | Spring Cloud LoadBalancer zone.
|
||||
|spring.cloud.loadbalancer.eager-load.enabled| | Enables eager load of client context.
|
||||
|spring.cloud.loadbalancer.eager-load.clients | |
|
||||
|spring.cloud.refresh.additional-property-sources-to-retain | | Additional property sources to retain during a refresh. Typically only system property sources are retained. This property allows property sources, such as property sources created by EnvironmentPostProcessors to be retained as well.
|
||||
|spring.cloud.refresh.enabled | `+++true+++` | Enables autoconfiguration for the refresh scope and associated features.
|
||||
|spring.cloud.refresh.extra-refreshable | `+++true+++` | Additional class names for beans to post process into refresh scope.
|
||||
|
||||
@@ -853,6 +853,12 @@ that retrieves available instances from Service Discovery using a <<discovery-cl
|
||||
|
||||
TIP: It is possible to disable Spring Cloud LoadBalancer by setting the value of `spring.cloud.loadbalancer.enabled` to `false`.
|
||||
|
||||
=== Eager loading of LoadBalancer contexts
|
||||
|
||||
Spring Cloud LoadBalancer creates a separate Spring child context for each service id. By default, these contexts are initialised lazily, whenever the first request for a service id is being load-balanced.
|
||||
|
||||
You can choose to load those contexts eagerly. In order to do that, specify the service ids for which you want to do eager load using the `spring.cloud-loadbalancer.eager-load.clients` property.
|
||||
|
||||
=== Switching between the load-balancing algorithms
|
||||
|
||||
The `ReactiveLoadBalancer` implementation that is used by default is `RoundRobinLoadBalancer`. To switch to a different implementation, either for selected services or all of them, you can use the <<custom-loadbalancer-configuration, custom LoadBalancer configurations mechanism>>.
|
||||
|
||||
@@ -25,7 +25,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
* @author Andrii Bohutskyi
|
||||
*/
|
||||
@ConfigurationProperties("spring.cloud.loadbalancer.eager-load")
|
||||
public class LoadbalancerEagerLoadProperties {
|
||||
public class LoadBalancerEagerLoadProperties {
|
||||
|
||||
private List<String> clients = new ArrayList<>();
|
||||
|
||||
@@ -36,4 +36,5 @@ public class LoadbalancerEagerLoadProperties {
|
||||
public void setClients(List<String> clients) {
|
||||
this.clients = clients;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -25,7 +25,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
|
||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||
import org.springframework.cloud.client.loadbalancer.LoadBalancerClientsProperties;
|
||||
import org.springframework.cloud.client.loadbalancer.LoadbalancerEagerLoadProperties;
|
||||
import org.springframework.cloud.client.loadbalancer.LoadBalancerEagerLoadProperties;
|
||||
import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration;
|
||||
import org.springframework.cloud.client.loadbalancer.reactive.ReactorLoadBalancerClientAutoConfiguration;
|
||||
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClientSpecification;
|
||||
@@ -42,7 +42,7 @@ import org.springframework.core.env.Environment;
|
||||
*/
|
||||
@Configuration(proxyBeanMethods = false)
|
||||
@LoadBalancerClients
|
||||
@EnableConfigurationProperties(LoadBalancerClientsProperties.class)
|
||||
@EnableConfigurationProperties({ LoadBalancerClientsProperties.class, LoadBalancerEagerLoadProperties.class })
|
||||
@AutoConfigureBefore({ ReactorLoadBalancerClientAutoConfiguration.class,
|
||||
LoadBalancerBeanPostProcessorAutoConfiguration.class })
|
||||
@ConditionalOnProperty(value = "spring.cloud.loadbalancer.enabled", havingValue = "true", matchIfMissing = true)
|
||||
@@ -69,9 +69,9 @@ public class LoadBalancerAutoConfiguration {
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConditionalOnProperty(value = "spring.cloud.loadbalancer.eager-load.enabled", havingValue = "true")
|
||||
public LoadBalancerEagerContextInitializer loadBalancerEagerContextInitializer(
|
||||
LoadBalancerClientFactory clientFactory, LoadbalancerEagerLoadProperties properties) {
|
||||
LoadBalancerClientFactory clientFactory, LoadBalancerEagerLoadProperties properties) {
|
||||
return new LoadBalancerEagerContextInitializer(clientFactory, properties.getClients());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,11 +16,11 @@
|
||||
|
||||
package org.springframework.cloud.loadbalancer.support;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.boot.context.event.ApplicationReadyEvent;
|
||||
import org.springframework.context.ApplicationListener;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author Andrii Bohutskyi
|
||||
*/
|
||||
@@ -37,11 +37,7 @@ public class LoadBalancerEagerContextInitializer implements ApplicationListener<
|
||||
|
||||
@Override
|
||||
public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) {
|
||||
warnUpFunction();
|
||||
}
|
||||
|
||||
private void warnUpFunction() {
|
||||
this.serviceNames.forEach(factory::getInstance);
|
||||
serviceNames.forEach(factory::getInstance);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -34,11 +34,6 @@
|
||||
"description": "Enables Spring Cloud LoadBalancer.",
|
||||
"type": "java.lang.Boolean"
|
||||
},
|
||||
{
|
||||
"name": "spring.cloud.loadbalancer.eager-load.enabled",
|
||||
"description": "Enables eager load of clients context.",
|
||||
"type": "java.lang.Boolean"
|
||||
},
|
||||
{
|
||||
"name": "spring.cloud.loadbalancer.eager-load.clients",
|
||||
"description": "Names of the clients.",
|
||||
|
||||
@@ -16,29 +16,25 @@
|
||||
|
||||
package org.springframework.cloud.loadbalancer.support;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
|
||||
import org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* @author Andrii Bohutskyi
|
||||
*/
|
||||
@ExtendWith(SpringExtension.class)
|
||||
@SpringBootTest(classes = {
|
||||
LoadBalancerAutoConfiguration.class,
|
||||
LoadBalancerEagerContextInitializerTest.SomeTestConfig.class
|
||||
})
|
||||
@SpringBootTest(
|
||||
classes = { LoadBalancerAutoConfiguration.class, LoadBalancerEagerContextInitializerTest.SomeTestConfig.class })
|
||||
class LoadBalancerEagerContextInitializerTest {
|
||||
|
||||
private static final String LOAD_BALANCER = "testLoadBalancer";
|
||||
@@ -58,7 +54,7 @@ class LoadBalancerEagerContextInitializerTest {
|
||||
static class SomeTestConfig {
|
||||
|
||||
@Bean
|
||||
public LoadBalancerEagerContextInitializer loadBalancerEagerContextInitializer(
|
||||
public LoadBalancerEagerContextInitializer testLoadBalancerEagerContextInitializer(
|
||||
LoadBalancerClientFactory factory) {
|
||||
return new LoadBalancerEagerContextInitializer(factory, Collections.singletonList(LOAD_BALANCER));
|
||||
}
|
||||
@@ -78,12 +74,14 @@ class LoadBalancerEagerContextInitializerTest {
|
||||
|
||||
private static final AtomicInteger COUNT = new AtomicInteger();
|
||||
|
||||
public LoadBalancerCounter() {
|
||||
LoadBalancerCounter() {
|
||||
COUNT.incrementAndGet();
|
||||
}
|
||||
|
||||
public static int getCount() {
|
||||
return COUNT.get();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user