Refactor eager-load PR. Add docs.

This commit is contained in:
Olga Maciaszek-Sharma
2022-07-01 18:15:15 +02:00
parent d84c772b7e
commit 9b67e2fd8e
7 changed files with 26 additions and 31 deletions

View File

@@ -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.

View File

@@ -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>>.

View File

@@ -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;
}
}

View File

@@ -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());
}
}

View File

@@ -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);
}
}

View File

@@ -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.",

View File

@@ -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();
}
}
}