Skip to content

Commit 2114c6c

Browse files
committed
feat:call choose method when eagerly initializing the load-balancers.
Signed-off-by: Haotian Zhang <[email protected]>
1 parent d64dcd8 commit 2114c6c

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/annotation/LoadBalancerClientConfiguration.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springframework.cloud.client.ServiceInstance;
3131
import org.springframework.cloud.client.discovery.DiscoveryClient;
3232
import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient;
33+
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
3334
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
3435
import org.springframework.cloud.loadbalancer.core.RetryAwareServiceInstanceListSupplier;
3536
import org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer;
@@ -59,6 +60,7 @@
5960
* @author BaoLin Zhu
6061
* @author changjin wei(魏昌进)
6162
* @author Zhuozhi Ji
63+
* @author Haotian Zhang
6264
*/
6365
@Configuration(proxyBeanMethods = false)
6466
@ConditionalOnDiscoveryEnabled
@@ -68,13 +70,24 @@ public class LoadBalancerClientConfiguration {
6870

6971
@Bean
7072
@ConditionalOnMissingBean
73+
@Conditional(DefaultStrategyCondition.class)
7174
public ReactorLoadBalancer<ServiceInstance> reactorServiceInstanceLoadBalancer(Environment environment,
7275
LoadBalancerClientFactory loadBalancerClientFactory) {
7376
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
7477
return new RoundRobinLoadBalancer(
7578
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
7679
}
7780

81+
@Bean
82+
@ConditionalOnMissingBean
83+
@Conditional(RandomStrategyCondition.class)
84+
public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
85+
LoadBalancerClientFactory loadBalancerClientFactory) {
86+
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
87+
return new RandomLoadBalancer(
88+
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
89+
}
90+
7891
@Configuration(proxyBeanMethods = false)
7992
@ConditionalOnReactiveDiscoveryEnabled
8093
@Order(REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER)
@@ -309,6 +322,26 @@ public ServiceInstanceListSupplier retryAwareDiscoveryClientServiceInstanceListS
309322

310323
}
311324

325+
static class DefaultStrategyCondition implements Condition {
326+
327+
@Override
328+
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
329+
return LoadBalancerEnvironmentPropertyUtils.equalToForClientOrDefault(context.getEnvironment(),
330+
"strategies", "default");
331+
}
332+
333+
}
334+
335+
static class RandomStrategyCondition implements Condition {
336+
337+
@Override
338+
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
339+
return LoadBalancerEnvironmentPropertyUtils.equalToForClientOrDefault(context.getEnvironment(),
340+
"strategies", "random");
341+
}
342+
343+
}
344+
312345
static final class BlockingOnAvoidPreviousInstanceAndRetryEnabledCondition extends AllNestedConditions {
313346

314347
private BlockingOnAvoidPreviousInstanceAndRetryEnabledCondition() {

spring-cloud-loadbalancer/src/test/java/org/springframework/cloud/loadbalancer/annotation/LoadBalancerClientConfigurationTests.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,11 @@
3535
import org.springframework.cloud.loadbalancer.core.DelegatingServiceInstanceListSupplier;
3636
import org.springframework.cloud.loadbalancer.core.DiscoveryClientServiceInstanceListSupplier;
3737
import org.springframework.cloud.loadbalancer.core.HealthCheckServiceInstanceListSupplier;
38+
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
39+
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
3840
import org.springframework.cloud.loadbalancer.core.RequestBasedStickySessionServiceInstanceListSupplier;
3941
import org.springframework.cloud.loadbalancer.core.RetryAwareServiceInstanceListSupplier;
42+
import org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer;
4043
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
4144
import org.springframework.cloud.loadbalancer.core.WeightedServiceInstanceListSupplier;
4245
import org.springframework.cloud.loadbalancer.core.ZonePreferenceServiceInstanceListSupplier;
@@ -54,6 +57,7 @@
5457
*
5558
* @author Olga Maciaszek-Sharma
5659
* @author Zhuozhi Ji
60+
* @author Haotian Zhang
5761
*/
5862
class LoadBalancerClientConfigurationTests {
5963

@@ -221,6 +225,24 @@ void shouldInstantiateBlockingWeightedServiceInstanceListSupplier() {
221225
});
222226
}
223227

228+
@Test
229+
void shouldInstantiateRoundRobinLoadBalancer() {
230+
blockingDiscoveryClientRunner.withPropertyValues("spring.cloud.loadbalancer.strategies=default")
231+
.run(context -> {
232+
ReactorLoadBalancer<?> reactorLoadBalancer = context.getBean(ReactorLoadBalancer.class);
233+
then(reactorLoadBalancer).isInstanceOf(RoundRobinLoadBalancer.class);
234+
});
235+
}
236+
237+
@Test
238+
void shouldInstantiateRandomLoadBalancer() {
239+
blockingDiscoveryClientRunner.withPropertyValues("spring.cloud.loadbalancer.strategies=random")
240+
.run(context -> {
241+
ReactorLoadBalancer<?> reactorLoadBalancer = context.getBean(ReactorLoadBalancer.class);
242+
then(reactorLoadBalancer).isInstanceOf(RandomLoadBalancer.class);
243+
});
244+
}
245+
224246
private static Stream<Arguments> blockingConfigurations() {
225247
return Stream.of(Arguments.of(RestTemplateTestConfig.class), Arguments.of(RestClientTestConfig.class),
226248
Arguments.of(RestTemplateAndRestClientConfig.class));

0 commit comments

Comments
 (0)