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 .config .XForwardedConfigurationCondition ;
3334import org .springframework .cloud .loadbalancer .core .ReactorLoadBalancer ;
3435import org .springframework .cloud .loadbalancer .core .RetryAwareServiceInstanceListSupplier ;
3536import org .springframework .cloud .loadbalancer .core .RoundRobinLoadBalancer ;
3637import org .springframework .cloud .loadbalancer .core .ServiceInstanceListSupplier ;
3738import org .springframework .cloud .loadbalancer .core .XForwardedHeadersTransformer ;
3839import org .springframework .cloud .loadbalancer .support .LoadBalancerClientFactory ;
40+ import org .springframework .cloud .loadbalancer .support .LoadBalancerEnvironmentPropertyUtils ;
3941import org .springframework .context .ConfigurableApplicationContext ;
4042import org .springframework .context .annotation .Bean ;
43+ import org .springframework .context .annotation .Condition ;
44+ import org .springframework .context .annotation .ConditionContext ;
4145import org .springframework .context .annotation .Conditional ;
4246import org .springframework .context .annotation .Configuration ;
4347import org .springframework .context .annotation .Primary ;
4448import org .springframework .core .annotation .Order ;
4549import org .springframework .core .env .Environment ;
50+ import org .springframework .core .type .AnnotatedTypeMetadata ;
4651import org .springframework .retry .support .RetryTemplate ;
4752import org .springframework .web .client .RestTemplate ;
4853import org .springframework .web .reactive .function .client .WebClient ;
@@ -76,8 +81,7 @@ public static class ReactiveSupportConfiguration {
7681 @ Bean
7782 @ ConditionalOnBean (ReactiveDiscoveryClient .class )
7883 @ ConditionalOnMissingBean
79- @ ConditionalOnProperty (value = "spring.cloud.loadbalancer.configurations" , havingValue = "default" ,
80- matchIfMissing = true )
84+ @ Conditional (DefaultConfigurationCondition .class )
8185 public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier (
8286 ConfigurableApplicationContext context ) {
8387 return ServiceInstanceListSupplier .builder ().withDiscoveryClient ().withCaching ().build (context );
@@ -86,7 +90,7 @@ public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
8690 @ Bean
8791 @ ConditionalOnBean (ReactiveDiscoveryClient .class )
8892 @ ConditionalOnMissingBean
89- @ ConditionalOnProperty ( value = "spring.cloud.loadbalancer.configurations" , havingValue = "zone-preference" )
93+ @ Conditional ( ZonePreferenceConfigurationCondition . class )
9094 public ServiceInstanceListSupplier zonePreferenceDiscoveryClientServiceInstanceListSupplier (
9195 ConfigurableApplicationContext context ) {
9296 return ServiceInstanceListSupplier .builder ().withDiscoveryClient ().withZonePreference ().withCaching ()
@@ -96,15 +100,15 @@ public ServiceInstanceListSupplier zonePreferenceDiscoveryClientServiceInstanceL
96100 @ Bean
97101 @ ConditionalOnBean ({ XForwardedHeadersTransformer .class , LoadBalancerClientFactory .class })
98102 @ ConditionalOnMissingBean
99- @ ConditionalOnProperty ( value = "spring.cloud.loadbalancer.xForwarded.enabledXforwarded" , havingValue = "true" )
103+ @ Conditional ( XForwardedConfigurationCondition . class )
100104 public XForwardedHeadersTransformer xForwarderHeadersTransformer (LoadBalancerClientFactory clientFactory ) {
101105 return new XForwardedHeadersTransformer (clientFactory );
102106 }
103107
104108 @ Bean
105109 @ ConditionalOnBean ({ ReactiveDiscoveryClient .class , WebClient .Builder .class })
106110 @ ConditionalOnMissingBean
107- @ ConditionalOnProperty ( value = "spring.cloud.loadbalancer.configurations" , havingValue = "health-check" )
111+ @ Conditional ( HealthCheckConfigurationCondition . class )
108112 public ServiceInstanceListSupplier healthCheckDiscoveryClientServiceInstanceListSupplier (
109113 ConfigurableApplicationContext context ) {
110114 return ServiceInstanceListSupplier .builder ().withDiscoveryClient ().withHealthChecks ().build (context );
@@ -113,8 +117,7 @@ public ServiceInstanceListSupplier healthCheckDiscoveryClientServiceInstanceList
113117 @ Bean
114118 @ ConditionalOnBean (ReactiveDiscoveryClient .class )
115119 @ ConditionalOnMissingBean
116- @ ConditionalOnProperty (value = "spring.cloud.loadbalancer.configurations" ,
117- havingValue = "request-based-sticky-session" )
120+ @ Conditional (RequestBasedStickySessionConfigurationCondition .class )
118121 public ServiceInstanceListSupplier requestBasedStickySessionDiscoveryClientServiceInstanceListSupplier (
119122 ConfigurableApplicationContext context ) {
120123 return ServiceInstanceListSupplier .builder ().withDiscoveryClient ().withRequestBasedStickySession ()
@@ -124,8 +127,7 @@ public ServiceInstanceListSupplier requestBasedStickySessionDiscoveryClientServi
124127 @ Bean
125128 @ ConditionalOnBean (ReactiveDiscoveryClient .class )
126129 @ ConditionalOnMissingBean
127- @ ConditionalOnProperty (value = "spring.cloud.loadbalancer.configurations" ,
128- havingValue = "same-instance-preference" )
130+ @ Conditional (SameInstancePreferenceConfigurationCondition .class )
129131 public ServiceInstanceListSupplier sameInstancePreferenceServiceInstanceListSupplier (
130132 ConfigurableApplicationContext context ) {
131133 return ServiceInstanceListSupplier .builder ().withDiscoveryClient ().withSameInstancePreference ()
@@ -142,8 +144,7 @@ public static class BlockingSupportConfiguration {
142144 @ Bean
143145 @ ConditionalOnBean (DiscoveryClient .class )
144146 @ ConditionalOnMissingBean
145- @ ConditionalOnProperty (value = "spring.cloud.loadbalancer.configurations" , havingValue = "default" ,
146- matchIfMissing = true )
147+ @ Conditional (DefaultConfigurationCondition .class )
147148 public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier (
148149 ConfigurableApplicationContext context ) {
149150 return ServiceInstanceListSupplier .builder ().withBlockingDiscoveryClient ().withCaching ().build (context );
@@ -152,7 +153,7 @@ public ServiceInstanceListSupplier discoveryClientServiceInstanceListSupplier(
152153 @ Bean
153154 @ ConditionalOnBean (DiscoveryClient .class )
154155 @ ConditionalOnMissingBean
155- @ ConditionalOnProperty ( value = "spring.cloud.loadbalancer.configurations" , havingValue = "zone-preference" )
156+ @ Conditional ( ZonePreferenceConfigurationCondition . class )
156157 public ServiceInstanceListSupplier zonePreferenceDiscoveryClientServiceInstanceListSupplier (
157158 ConfigurableApplicationContext context ) {
158159 return ServiceInstanceListSupplier .builder ().withBlockingDiscoveryClient ().withZonePreference ()
@@ -162,7 +163,7 @@ public ServiceInstanceListSupplier zonePreferenceDiscoveryClientServiceInstanceL
162163 @ Bean
163164 @ ConditionalOnBean ({ DiscoveryClient .class , RestTemplate .class })
164165 @ ConditionalOnMissingBean
165- @ ConditionalOnProperty ( value = "spring.cloud.loadbalancer.configurations" , havingValue = "health-check" )
166+ @ Conditional ( HealthCheckConfigurationCondition . class )
166167 public ServiceInstanceListSupplier healthCheckDiscoveryClientServiceInstanceListSupplier (
167168 ConfigurableApplicationContext context ) {
168169 return ServiceInstanceListSupplier .builder ().withBlockingDiscoveryClient ().withBlockingHealthChecks ()
@@ -172,8 +173,7 @@ public ServiceInstanceListSupplier healthCheckDiscoveryClientServiceInstanceList
172173 @ Bean
173174 @ ConditionalOnBean (DiscoveryClient .class )
174175 @ ConditionalOnMissingBean
175- @ ConditionalOnProperty (value = "spring.cloud.loadbalancer.configurations" ,
176- havingValue = "request-based-sticky-session" )
176+ @ Conditional (RequestBasedStickySessionConfigurationCondition .class )
177177 public ServiceInstanceListSupplier requestBasedStickySessionDiscoveryClientServiceInstanceListSupplier (
178178 ConfigurableApplicationContext context ) {
179179 return ServiceInstanceListSupplier .builder ().withBlockingDiscoveryClient ().withRequestBasedStickySession ()
@@ -183,8 +183,7 @@ public ServiceInstanceListSupplier requestBasedStickySessionDiscoveryClientServi
183183 @ Bean
184184 @ ConditionalOnBean (DiscoveryClient .class )
185185 @ ConditionalOnMissingBean
186- @ ConditionalOnProperty (value = "spring.cloud.loadbalancer.configurations" ,
187- havingValue = "same-instance-preference" )
186+ @ Conditional (SameInstancePreferenceConfigurationCondition .class )
188187 public ServiceInstanceListSupplier sameInstancePreferenceServiceInstanceListSupplier (
189188 ConfigurableApplicationContext context ) {
190189 return ServiceInstanceListSupplier .builder ().withBlockingDiscoveryClient ().withSameInstancePreference ()
@@ -241,8 +240,7 @@ static class LoadBalancerRetryEnabled {
241240
242241 }
243242
244- @ ConditionalOnProperty (value = "spring.cloud.loadbalancer.retry.avoid-previous-instance" , havingValue = "true" ,
245- matchIfMissing = true )
243+ @ Conditional (AvoidPreviousInstanceEnabledCondition .class )
246244 static class AvoidPreviousInstanceEnabled {
247245
248246 }
@@ -260,12 +258,71 @@ static class LoadBalancerRetryEnabled {
260258
261259 }
262260
263- @ ConditionalOnProperty (value = "spring.cloud.loadbalancer.retry.avoid-previous-instance" , havingValue = "true" ,
264- matchIfMissing = true )
261+ @ Conditional (AvoidPreviousInstanceEnabledCondition .class )
265262 static class AvoidPreviousInstanceEnabled {
266263
267264 }
268265
269266 }
270267
268+ static class AvoidPreviousInstanceEnabledCondition implements Condition {
269+
270+ @ Override
271+ public boolean matches (ConditionContext context , AnnotatedTypeMetadata metadata ) {
272+ return LoadBalancerEnvironmentPropertyUtils .trueOrMissingForClientOrDefault (context .getEnvironment (),
273+ "retry.avoid-previous-instance" );
274+ }
275+
276+ }
277+
278+ static class DefaultConfigurationCondition implements Condition {
279+
280+ @ Override
281+ public boolean matches (ConditionContext context , AnnotatedTypeMetadata metadata ) {
282+ return LoadBalancerEnvironmentPropertyUtils .equalToOrMissingForClientOrDefault (context .getEnvironment (),
283+ "configurations" , "default" );
284+ }
285+
286+ }
287+
288+ static class ZonePreferenceConfigurationCondition implements Condition {
289+
290+ @ Override
291+ public boolean matches (ConditionContext context , AnnotatedTypeMetadata metadata ) {
292+ return LoadBalancerEnvironmentPropertyUtils .equalToForClientOrDefault (context .getEnvironment (),
293+ "configurations" , "zone-preference" );
294+ }
295+
296+ }
297+
298+ static class HealthCheckConfigurationCondition implements Condition {
299+
300+ @ Override
301+ public boolean matches (ConditionContext context , AnnotatedTypeMetadata metadata ) {
302+ return LoadBalancerEnvironmentPropertyUtils .equalToForClientOrDefault (context .getEnvironment (),
303+ "configurations" , "health-check" );
304+ }
305+
306+ }
307+
308+ static class RequestBasedStickySessionConfigurationCondition implements Condition {
309+
310+ @ Override
311+ public boolean matches (ConditionContext context , AnnotatedTypeMetadata metadata ) {
312+ return LoadBalancerEnvironmentPropertyUtils .equalToForClientOrDefault (context .getEnvironment (),
313+ "configurations" , "request-based-sticky-session" );
314+ }
315+
316+ }
317+
318+ static class SameInstancePreferenceConfigurationCondition implements Condition {
319+
320+ @ Override
321+ public boolean matches (ConditionContext context , AnnotatedTypeMetadata metadata ) {
322+ return LoadBalancerEnvironmentPropertyUtils .equalToForClientOrDefault (context .getEnvironment (),
323+ "configurations" , "same-instance-preference" );
324+ }
325+
326+ }
327+
271328}
0 commit comments