3030import org .springframework .cloud .client .ServiceInstance ;
3131import org .springframework .cloud .client .discovery .DiscoveryClient ;
3232import org .springframework .cloud .client .discovery .ReactiveDiscoveryClient ;
33+ import org .springframework .cloud .loadbalancer .core .RandomLoadBalancer ;
3334import org .springframework .cloud .loadbalancer .core .ReactorLoadBalancer ;
3435import org .springframework .cloud .loadbalancer .core .RetryAwareServiceInstanceListSupplier ;
3536import org .springframework .cloud .loadbalancer .core .RoundRobinLoadBalancer ;
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 () {
0 commit comments