From 68d43a177ed8f2367674fff58b8aedc2e05591ce Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Tue, 2 Nov 2021 15:21:27 +0100 Subject: [PATCH] Switch to using LB per-client properties. Add deprecation docs. (#1036) --- .../RetryLoadBalancerInterceptor.java | 4 ++ ...torLoadBalancerExchangeFilterFunction.java | 4 ++ ...bleLoadBalancerExchangeFilterFunction.java | 4 ++ .../LoadBalancerClientConfiguration.java | 2 +- .../XForwardedHeadersTransformer.java | 6 +-- .../client/BlockingLoadBalancerClient.java | 14 +++++-- ...ngLoadBalancerClientAutoConfiguration.java | 6 +-- ...ealthCheckServiceInstanceListSupplier.java | 23 +++++++++++ .../HintBasedServiceInstanceListSupplier.java | 12 ++++++ ...ancerServiceInstanceCookieTransformer.java | 13 ++++++- ...ckySessionServiceInstanceListSupplier.java | 12 ++++++ .../ServiceInstanceListSupplierBuilder.java | 38 ++++++++++--------- .../core/XForwardedHeadersTransformer.java | 6 +-- .../support/LoadBalancerClientFactory.java | 4 ++ ...rviceInstanceListSupplierBuilderTests.java | 7 ++-- 15 files changed, 119 insertions(+), 36 deletions(-) diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptor.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptor.java index fc20c055..cc7fbd29 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptor.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptor.java @@ -57,6 +57,10 @@ public class RetryLoadBalancerInterceptor implements ClientHttpRequestIntercepto private final ReactiveLoadBalancer.Factory loadBalancerFactory; + /** + * @deprecated in favour of + * {@link RetryLoadBalancerInterceptor#RetryLoadBalancerInterceptor(LoadBalancerClient, LoadBalancerRequestFactory, LoadBalancedRetryFactory, ReactiveLoadBalancer.Factory)} + */ @Deprecated public RetryLoadBalancerInterceptor(LoadBalancerClient loadBalancer, LoadBalancerProperties properties, LoadBalancerRequestFactory requestFactory, LoadBalancedRetryFactory lbRetryFactory, diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/reactive/ReactorLoadBalancerExchangeFilterFunction.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/reactive/ReactorLoadBalancerExchangeFilterFunction.java index 528caffa..d9bbf454 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/reactive/ReactorLoadBalancerExchangeFilterFunction.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/reactive/ReactorLoadBalancerExchangeFilterFunction.java @@ -75,6 +75,10 @@ public class ReactorLoadBalancerExchangeFilterFunction implements LoadBalancedEx this(loadBalancerFactory, properties, Collections.emptyList()); } + /** + * @deprecated in favour of + * {@link ReactorLoadBalancerExchangeFilterFunction#ReactorLoadBalancerExchangeFilterFunction(ReactiveLoadBalancer.Factory, List)} + */ @Deprecated public ReactorLoadBalancerExchangeFilterFunction(ReactiveLoadBalancer.Factory loadBalancerFactory, LoadBalancerProperties properties, List transformers) { diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/reactive/RetryableLoadBalancerExchangeFilterFunction.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/reactive/RetryableLoadBalancerExchangeFilterFunction.java index 5256284e..d55f0bc5 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/reactive/RetryableLoadBalancerExchangeFilterFunction.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/reactive/RetryableLoadBalancerExchangeFilterFunction.java @@ -85,6 +85,10 @@ public class RetryableLoadBalancerExchangeFilterFunction implements LoadBalanced this(retryPolicy, loadBalancerFactory, properties, Collections.emptyList()); } + /** + * @deprecated in favour of + * {@link ReactorLoadBalancerExchangeFilterFunction#ReactorLoadBalancerExchangeFilterFunction(ReactiveLoadBalancer.Factory, List)} + */ @Deprecated public RetryableLoadBalancerExchangeFilterFunction(LoadBalancerRetryPolicy retryPolicy, ReactiveLoadBalancer.Factory loadBalancerFactory, LoadBalancerProperties properties, diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/annotation/LoadBalancerClientConfiguration.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/annotation/LoadBalancerClientConfiguration.java index 3216e21a..a820f6ec 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/annotation/LoadBalancerClientConfiguration.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/annotation/LoadBalancerClientConfiguration.java @@ -94,7 +94,7 @@ public class LoadBalancerClientConfiguration { } @Bean - @ConditionalOnBean(XForwardedHeadersTransformer.class) + @ConditionalOnBean({ XForwardedHeadersTransformer.class, LoadBalancerClientFactory.class }) @ConditionalOnMissingBean @ConditionalOnProperty(value = "spring.cloud.loadbalancer.xForwarded.enabledXforwarded", havingValue = "true") public XForwardedHeadersTransformer xForwarderHeadersTransformer(LoadBalancerClientFactory clientFactory) { diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/blocking/XForwardedHeadersTransformer.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/blocking/XForwardedHeadersTransformer.java index 3d96d584..09a605fe 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/blocking/XForwardedHeadersTransformer.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/blocking/XForwardedHeadersTransformer.java @@ -19,7 +19,7 @@ package org.springframework.cloud.loadbalancer.blocking; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties; import org.springframework.cloud.client.loadbalancer.LoadBalancerRequestTransformer; -import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; +import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpRequest; @@ -33,9 +33,9 @@ import org.springframework.http.HttpRequest; public class XForwardedHeadersTransformer implements LoadBalancerRequestTransformer { - private final LoadBalancerClientFactory factory; + private final ReactiveLoadBalancer.Factory factory; - public XForwardedHeadersTransformer(LoadBalancerClientFactory factory) { + public XForwardedHeadersTransformer(ReactiveLoadBalancer.Factory factory) { this.factory = factory; } diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/blocking/client/BlockingLoadBalancerClient.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/blocking/client/BlockingLoadBalancerClient.java index e689588b..47c1bacc 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/blocking/client/BlockingLoadBalancerClient.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/blocking/client/BlockingLoadBalancerClient.java @@ -54,15 +54,20 @@ import static org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoa @SuppressWarnings({ "unchecked", "rawtypes" }) public class BlockingLoadBalancerClient implements LoadBalancerClient { - private final LoadBalancerClientFactory loadBalancerClientFactory; - - private final LoadBalancerProperties properties; + private final ReactiveLoadBalancer.Factory loadBalancerClientFactory; + /** + * @deprecated in favour of + * {@link BlockingLoadBalancerClient#BlockingLoadBalancerClient(ReactiveLoadBalancer.Factory)} + */ + @Deprecated public BlockingLoadBalancerClient(LoadBalancerClientFactory loadBalancerClientFactory, LoadBalancerProperties properties) { this.loadBalancerClientFactory = loadBalancerClientFactory; - this.properties = properties; + } + public BlockingLoadBalancerClient(ReactiveLoadBalancer.Factory loadBalancerClientFactory) { + this.loadBalancerClientFactory = loadBalancerClientFactory; } @Override @@ -155,6 +160,7 @@ public class BlockingLoadBalancerClient implements LoadBalancerClient { } private String getHint(String serviceId) { + LoadBalancerProperties properties = loadBalancerClientFactory.getProperties(serviceId); String defaultHint = properties.getHint().getOrDefault("default", "default"); String hintPropertyValue = properties.getHint().get(serviceId); return hintPropertyValue != null ? hintPropertyValue : defaultHint; diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfiguration.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfiguration.java index 4ee9d928..fd8a3663 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfiguration.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/config/BlockingLoadBalancerClientAutoConfiguration.java @@ -59,9 +59,8 @@ public class BlockingLoadBalancerClientAutoConfiguration { @Bean @ConditionalOnBean(LoadBalancerClientFactory.class) @ConditionalOnMissingBean - public LoadBalancerClient blockingLoadBalancerClient(LoadBalancerClientFactory loadBalancerClientFactory, - LoadBalancerProperties properties) { - return new BlockingLoadBalancerClient(loadBalancerClientFactory, properties); + public LoadBalancerClient blockingLoadBalancerClient(LoadBalancerClientFactory loadBalancerClientFactory) { + return new BlockingLoadBalancerClient(loadBalancerClientFactory); } @Bean @@ -76,6 +75,7 @@ public class BlockingLoadBalancerClientAutoConfiguration { @Bean @ConditionalOnProperty(value = "spring.cloud.loadbalancer.xforwarded.enabledXforwarded", havingValue = "true") @ConditionalOnMissingBean(XForwardedHeadersTransformer.class) + @ConditionalOnBean(LoadBalancerClientFactory.class) public XForwardedHeadersTransformer xForwarderHeadersTransformer( LoadBalancerClientFactory loadBalancerClientFactory) { return new XForwardedHeadersTransformer(loadBalancerClientFactory); diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/HealthCheckServiceInstanceListSupplier.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/HealthCheckServiceInstanceListSupplier.java index 0aa33849..61182cef 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/HealthCheckServiceInstanceListSupplier.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/HealthCheckServiceInstanceListSupplier.java @@ -32,6 +32,7 @@ import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties; +import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer; import org.springframework.util.StringUtils; /** @@ -59,6 +60,11 @@ public class HealthCheckServiceInstanceListSupplier extends DelegatingServiceIns private final BiFunction> aliveFunction; + /** + * @deprecated in favour of + * {@link HealthCheckServiceInstanceListSupplier#HealthCheckServiceInstanceListSupplier(ServiceInstanceListSupplier, ReactiveLoadBalancer.Factory, BiFunction)} + */ + @Deprecated public HealthCheckServiceInstanceListSupplier(ServiceInstanceListSupplier delegate, LoadBalancerProperties.HealthCheck healthCheck, BiFunction> aliveFunction) { @@ -76,6 +82,23 @@ public class HealthCheckServiceInstanceListSupplier extends DelegatingServiceIns .refCount(1); } + public HealthCheckServiceInstanceListSupplier(ServiceInstanceListSupplier delegate, + ReactiveLoadBalancer.Factory loadBalancerClientFactory, + BiFunction> aliveFunction) { + super(delegate); + this.healthCheck = loadBalancerClientFactory.getProperties(getServiceId()).getHealthCheck(); + defaultHealthCheckPath = healthCheck.getPath().getOrDefault("default", "/actuator/health"); + this.aliveFunction = aliveFunction; + Repeat aliveInstancesReplayRepeat = Repeat + .onlyIf(repeatContext -> this.healthCheck.getRefetchInstances()) + .fixedBackoff(healthCheck.getRefetchInstancesInterval()); + Flux> aliveInstancesFlux = Flux.defer(delegate).repeatWhen(aliveInstancesReplayRepeat) + .switchMap(serviceInstances -> healthCheckFlux(serviceInstances) + .map(alive -> Collections.unmodifiableList(new ArrayList<>(alive)))); + aliveInstancesReplay = aliveInstancesFlux.delaySubscription(healthCheck.getInitialDelay()).replay(1) + .refCount(1); + } + @Override public void afterPropertiesSet() { Disposable healthCheckDisposable = this.healthCheckDisposable; diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/HintBasedServiceInstanceListSupplier.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/HintBasedServiceInstanceListSupplier.java index b79bff3d..c63d7d3d 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/HintBasedServiceInstanceListSupplier.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/HintBasedServiceInstanceListSupplier.java @@ -26,6 +26,7 @@ import org.springframework.cloud.client.loadbalancer.HintRequestContext; import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties; import org.springframework.cloud.client.loadbalancer.Request; import org.springframework.cloud.client.loadbalancer.RequestDataContext; +import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer; import org.springframework.http.HttpHeaders; import org.springframework.util.StringUtils; @@ -40,12 +41,23 @@ public class HintBasedServiceInstanceListSupplier extends DelegatingServiceInsta private final LoadBalancerProperties properties; + /** + * @deprecated in favour of + * {@link HintBasedServiceInstanceListSupplier#HintBasedServiceInstanceListSupplier(ServiceInstanceListSupplier, ReactiveLoadBalancer.Factory)} + */ + @Deprecated public HintBasedServiceInstanceListSupplier(ServiceInstanceListSupplier delegate, LoadBalancerProperties properties) { super(delegate); this.properties = properties; } + public HintBasedServiceInstanceListSupplier(ServiceInstanceListSupplier delegate, + ReactiveLoadBalancer.Factory factory) { + super(delegate); + this.properties = factory.getProperties(getServiceId()); + } + @Override public Flux> get() { return delegate.get(); diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/LoadBalancerServiceInstanceCookieTransformer.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/LoadBalancerServiceInstanceCookieTransformer.java index 08bcbd43..7ab2a46b 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/LoadBalancerServiceInstanceCookieTransformer.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/LoadBalancerServiceInstanceCookieTransformer.java @@ -23,6 +23,7 @@ import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties; import org.springframework.cloud.client.loadbalancer.LoadBalancerRequestTransformer; +import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer; import org.springframework.http.HttpCookie; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpRequest; @@ -37,18 +38,26 @@ import org.springframework.util.StringUtils; */ public class LoadBalancerServiceInstanceCookieTransformer implements LoadBalancerRequestTransformer { - private final LoadBalancerProperties.StickySession stickySessionProperties; + private ReactiveLoadBalancer.Factory factory; + + private LoadBalancerProperties.StickySession stickySessionProperties; public LoadBalancerServiceInstanceCookieTransformer(LoadBalancerProperties.StickySession stickySessionProperties) { this.stickySessionProperties = stickySessionProperties; } + public LoadBalancerServiceInstanceCookieTransformer(ReactiveLoadBalancer.Factory factory) { + this.factory = factory; + } + @Override public HttpRequest transformRequest(HttpRequest request, ServiceInstance instance) { if (instance == null) { return request; } - String instanceIdCookieName = stickySessionProperties.getInstanceIdCookieName(); + LoadBalancerProperties.StickySession stickySession = factory != null + ? factory.getProperties(instance.getServiceId()).getStickySession() : stickySessionProperties; + String instanceIdCookieName = stickySession.getInstanceIdCookieName(); if (!StringUtils.hasText(instanceIdCookieName)) { return request; } diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/RequestBasedStickySessionServiceInstanceListSupplier.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/RequestBasedStickySessionServiceInstanceListSupplier.java index 5efe477f..4bf2bf81 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/RequestBasedStickySessionServiceInstanceListSupplier.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/RequestBasedStickySessionServiceInstanceListSupplier.java @@ -27,6 +27,7 @@ import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties; import org.springframework.cloud.client.loadbalancer.Request; import org.springframework.cloud.client.loadbalancer.RequestDataContext; +import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer; import org.springframework.util.MultiValueMap; /** @@ -42,12 +43,23 @@ public class RequestBasedStickySessionServiceInstanceListSupplier extends Delega private final LoadBalancerProperties properties; + /** + * @deprecated in favour of + * {@link RequestBasedStickySessionServiceInstanceListSupplier#RequestBasedStickySessionServiceInstanceListSupplier(ServiceInstanceListSupplier, ReactiveLoadBalancer.Factory)} + */ + @Deprecated public RequestBasedStickySessionServiceInstanceListSupplier(ServiceInstanceListSupplier delegate, LoadBalancerProperties properties) { super(delegate); this.properties = properties; } + public RequestBasedStickySessionServiceInstanceListSupplier(ServiceInstanceListSupplier delegate, + ReactiveLoadBalancer.Factory loadBalancerClientFactory) { + super(delegate); + this.properties = loadBalancerClientFactory.getProperties(getServiceId()); + } + @Override public Flux> get() { return delegate.get(); diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/ServiceInstanceListSupplierBuilder.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/ServiceInstanceListSupplierBuilder.java index 65a81020..20891426 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/ServiceInstanceListSupplierBuilder.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/ServiceInstanceListSupplierBuilder.java @@ -30,9 +30,10 @@ import org.springframework.beans.factory.ObjectProvider; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; -import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties; +import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer; import org.springframework.cloud.loadbalancer.cache.LoadBalancerCacheManager; import org.springframework.cloud.loadbalancer.config.LoadBalancerZoneConfig; +import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.http.HttpStatus; import org.springframework.util.Assert; @@ -117,9 +118,10 @@ public final class ServiceInstanceListSupplierBuilder { */ public ServiceInstanceListSupplierBuilder withHealthChecks() { DelegateCreator creator = (context, delegate) -> { - LoadBalancerProperties properties = context.getBean(LoadBalancerProperties.class); + ReactiveLoadBalancer.Factory loadBalancerClientFactory = context + .getBean(LoadBalancerClientFactory.class); WebClient.Builder webClient = context.getBean(WebClient.Builder.class); - return healthCheckServiceInstanceListSupplier(webClient.build(), delegate, properties); + return healthCheckServiceInstanceListSupplier(webClient.build(), delegate, loadBalancerClientFactory); }; this.creators.add(creator); return this; @@ -133,8 +135,8 @@ public final class ServiceInstanceListSupplierBuilder { */ public ServiceInstanceListSupplierBuilder withHealthChecks(WebClient webClient) { DelegateCreator creator = (context, delegate) -> { - LoadBalancerProperties properties = context.getBean(LoadBalancerProperties.class); - return healthCheckServiceInstanceListSupplier(webClient, delegate, properties); + LoadBalancerClientFactory loadBalancerClientFactory = context.getBean(LoadBalancerClientFactory.class); + return healthCheckServiceInstanceListSupplier(webClient, delegate, loadBalancerClientFactory); }; this.creators.add(creator); return this; @@ -160,8 +162,8 @@ public final class ServiceInstanceListSupplierBuilder { public ServiceInstanceListSupplierBuilder withBlockingHealthChecks() { DelegateCreator creator = (context, delegate) -> { RestTemplate restTemplate = context.getBean(RestTemplate.class); - LoadBalancerProperties properties = context.getBean(LoadBalancerProperties.class); - return blockingHealthCheckServiceInstanceListSupplier(restTemplate, delegate, properties); + LoadBalancerClientFactory loadBalancerClientFactory = context.getBean(LoadBalancerClientFactory.class); + return blockingHealthCheckServiceInstanceListSupplier(restTemplate, delegate, loadBalancerClientFactory); }; this.creators.add(creator); return this; @@ -175,8 +177,8 @@ public final class ServiceInstanceListSupplierBuilder { */ public ServiceInstanceListSupplierBuilder withBlockingHealthChecks(RestTemplate restTemplate) { DelegateCreator creator = (context, delegate) -> { - LoadBalancerProperties properties = context.getBean(LoadBalancerProperties.class); - return blockingHealthCheckServiceInstanceListSupplier(restTemplate, delegate, properties); + LoadBalancerClientFactory loadBalancerClientFactory = context.getBean(LoadBalancerClientFactory.class); + return blockingHealthCheckServiceInstanceListSupplier(restTemplate, delegate, loadBalancerClientFactory); }; this.creators.add(creator); return this; @@ -203,8 +205,8 @@ public final class ServiceInstanceListSupplierBuilder { */ public ServiceInstanceListSupplierBuilder withRequestBasedStickySession() { DelegateCreator creator = (context, delegate) -> { - LoadBalancerProperties properties = context.getBean(LoadBalancerProperties.class); - return new RequestBasedStickySessionServiceInstanceListSupplier(delegate, properties); + LoadBalancerClientFactory loadBalancerClientFactory = context.getBean(LoadBalancerClientFactory.class); + return new RequestBasedStickySessionServiceInstanceListSupplier(delegate, loadBalancerClientFactory); }; this.creators.add(creator); return this; @@ -245,8 +247,8 @@ public final class ServiceInstanceListSupplierBuilder { public ServiceInstanceListSupplierBuilder withHints() { DelegateCreator creator = (context, delegate) -> { - LoadBalancerProperties properties = context.getBean(LoadBalancerProperties.class); - return new HintBasedServiceInstanceListSupplier(delegate, properties); + LoadBalancerClientFactory factory = context.getBean(LoadBalancerClientFactory.class); + return new HintBasedServiceInstanceListSupplier(delegate, factory); }; creators.add(creator); return this; @@ -287,8 +289,9 @@ public final class ServiceInstanceListSupplierBuilder { } private ServiceInstanceListSupplier healthCheckServiceInstanceListSupplier(WebClient webClient, - ServiceInstanceListSupplier delegate, LoadBalancerProperties properties) { - return new HealthCheckServiceInstanceListSupplier(delegate, properties.getHealthCheck(), + ServiceInstanceListSupplier delegate, + ReactiveLoadBalancer.Factory loadBalancerClientFactory) { + return new HealthCheckServiceInstanceListSupplier(delegate, loadBalancerClientFactory, (serviceInstance, healthCheckPath) -> webClient.get() .uri(UriComponentsBuilder.fromUriString(getUri(serviceInstance, healthCheckPath)).build() .toUri()) @@ -297,8 +300,9 @@ public final class ServiceInstanceListSupplierBuilder { } private ServiceInstanceListSupplier blockingHealthCheckServiceInstanceListSupplier(RestTemplate restTemplate, - ServiceInstanceListSupplier delegate, LoadBalancerProperties properties) { - return new HealthCheckServiceInstanceListSupplier(delegate, properties.getHealthCheck(), + ServiceInstanceListSupplier delegate, + ReactiveLoadBalancer.Factory loadBalancerClientFactory) { + return new HealthCheckServiceInstanceListSupplier(delegate, loadBalancerClientFactory, (serviceInstance, healthCheckPath) -> Mono.defer(() -> { URI uri = UriComponentsBuilder.fromUriString(getUri(serviceInstance, healthCheckPath)).build() .toUri(); diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/XForwardedHeadersTransformer.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/XForwardedHeadersTransformer.java index b4bc45f9..0a41701b 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/XForwardedHeadersTransformer.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/core/XForwardedHeadersTransformer.java @@ -19,7 +19,7 @@ package org.springframework.cloud.loadbalancer.core; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerProperties; import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerClientRequestTransformer; -import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; +import org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer; import org.springframework.http.HttpHeaders; import org.springframework.web.reactive.function.client.ClientRequest; @@ -33,9 +33,9 @@ import org.springframework.web.reactive.function.client.ClientRequest; public class XForwardedHeadersTransformer implements LoadBalancerClientRequestTransformer { - private final LoadBalancerClientFactory clientFactory; + private final ReactiveLoadBalancer.Factory clientFactory; - public XForwardedHeadersTransformer(LoadBalancerClientFactory clientFactory) { + public XForwardedHeadersTransformer(ReactiveLoadBalancer.Factory clientFactory) { this.clientFactory = clientFactory; } diff --git a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/support/LoadBalancerClientFactory.java b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/support/LoadBalancerClientFactory.java index 5fb40fdd..3596352b 100644 --- a/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/support/LoadBalancerClientFactory.java +++ b/spring-cloud-loadbalancer/src/main/java/org/springframework/cloud/loadbalancer/support/LoadBalancerClientFactory.java @@ -55,6 +55,10 @@ public class LoadBalancerClientFactory extends NamedContextFactory