From f2bc8e838a1e0e2a1a573e7adcbfb35ef3a6670d Mon Sep 17 00:00:00 2001 From: wind57 Date: Sun, 12 Oct 2025 12:47:01 +0300 Subject: [PATCH 1/4] wip Signed-off-by: wind57 --- ...ClientAbstractInformerDiscoveryClient.java | 199 ++++++++++++++++++ ...lientCacheableInformerDiscoveryClient.java | 51 +++++ ...bernetesClientInformerDiscoveryClient.java | 173 +-------------- 3 files changed, 259 insertions(+), 164 deletions(-) create mode 100644 spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientAbstractInformerDiscoveryClient.java create mode 100644 spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerDiscoveryClient.java diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientAbstractInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientAbstractInformerDiscoveryClient.java new file mode 100644 index 0000000000..519fc0ca5a --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientAbstractInformerDiscoveryClient.java @@ -0,0 +1,199 @@ +package org.springframework.cloud.kubernetes.client.discovery; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.function.Predicate; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import io.kubernetes.client.informer.SharedInformer; +import io.kubernetes.client.informer.SharedInformerFactory; +import io.kubernetes.client.informer.cache.Lister; +import io.kubernetes.client.openapi.apis.CoreV1Api; +import io.kubernetes.client.openapi.models.V1EndpointAddress; +import io.kubernetes.client.openapi.models.V1EndpointSubset; +import io.kubernetes.client.openapi.models.V1Endpoints; +import io.kubernetes.client.openapi.models.V1Service; +import jakarta.annotation.PostConstruct; +import org.apache.commons.logging.LogFactory; + +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.ServiceMetadata; +import org.springframework.cloud.kubernetes.commons.discovery.ServicePortNameAndNumber; +import org.springframework.cloud.kubernetes.commons.discovery.ServicePortSecureResolver; +import org.springframework.core.log.LogAccessor; + +import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientDiscoveryClientUtils.addresses; +import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientDiscoveryClientUtils.endpointSubsetsPortData; +import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientDiscoveryClientUtils.matchesServiceLabels; +import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientDiscoveryClientUtils.postConstruct; +import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientDiscoveryClientUtils.serviceMetadata; +import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientInstanceIdHostPodNameSupplier.externalName; +import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientInstanceIdHostPodNameSupplier.nonExternalName; +import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientPodLabelsAndAnnotationsSupplier.nonExternalName; +import static org.springframework.cloud.kubernetes.commons.discovery.DiscoveryClientUtils.endpointsPort; +import static org.springframework.cloud.kubernetes.commons.discovery.DiscoveryClientUtils.externalNameServiceInstance; +import static org.springframework.cloud.kubernetes.commons.discovery.DiscoveryClientUtils.serviceInstance; +import static org.springframework.cloud.kubernetes.commons.discovery.DiscoveryClientUtils.serviceInstanceMetadata; +import static org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryConstants.EXTERNAL_NAME; + +abstract class KubernetesClientAbstractInformerDiscoveryClient implements DiscoveryClient { + + private static final LogAccessor LOG = new LogAccessor( + LogFactory.getLog(KubernetesClientAbstractInformerDiscoveryClient.class)); + + private final List sharedInformerFactories; + + private final List> serviceListers; + + private final List> endpointsListers; + + private final Supplier informersReadyFunc; + + private final KubernetesDiscoveryProperties properties; + + private final Predicate predicate; + + private final ServicePortSecureResolver servicePortSecureResolver; + + private final CoreV1Api coreV1Api; + + KubernetesClientAbstractInformerDiscoveryClient(List sharedInformerFactories, + List> serviceListers, List> endpointsListers, + List> serviceInformers, List> endpointsInformers, + KubernetesDiscoveryProperties properties, CoreV1Api coreV1Api, Predicate predicate) { + this.sharedInformerFactories = sharedInformerFactories; + this.serviceListers = serviceListers; + this.endpointsListers = endpointsListers; + this.coreV1Api = coreV1Api; + this.properties = properties; + this.predicate = predicate; + + servicePortSecureResolver = new ServicePortSecureResolver(properties); + + this.informersReadyFunc = () -> { + boolean serviceInformersReady = serviceInformers.isEmpty() || serviceInformers.stream() + .map(SharedInformer::hasSynced) + .reduce(Boolean::logicalAnd) + .orElse(false); + boolean endpointsInformersReady = endpointsInformers.isEmpty() || endpointsInformers.stream() + .map(SharedInformer::hasSynced) + .reduce(Boolean::logicalAnd) + .orElse(false); + return serviceInformersReady && endpointsInformersReady; + }; + + } + + @Override + public List getServices() { + List services = serviceListers.stream() + .flatMap(serviceLister -> serviceLister.list().stream()) + .filter(service -> matchesServiceLabels(service, properties)) + .filter(predicate) + .map(s -> s.getMetadata().getName()) + .distinct() + .toList(); + LOG.debug(() -> "will return services : " + services); + return services; + } + + @Override + public List getInstances(String serviceId) { + Objects.requireNonNull(serviceId, "serviceId must be provided"); + + List allServices = serviceListers.stream() + .flatMap(x -> x.list().stream()) + .filter(scv -> scv.getMetadata() != null) + .filter(svc -> serviceId.equals(svc.getMetadata().getName())) + .filter(scv -> matchesServiceLabels(scv, properties)) + .toList(); + + List serviceInstances = allServices.stream() + .filter(predicate) + .flatMap(service -> serviceInstances(service, serviceId).stream()) + .collect(Collectors.toCollection(ArrayList::new)); + + if (properties.includeExternalNameServices()) { + LOG.debug(() -> "Searching for 'ExternalName' type of services with serviceId : " + serviceId); + List externalNameServices = allServices.stream() + .filter(s -> s.getSpec() != null) + .filter(s -> EXTERNAL_NAME.equals(s.getSpec().getType())) + .toList(); + for (V1Service service : externalNameServices) { + ServiceMetadata serviceMetadata = serviceMetadata(service); + Map serviceInstanceMetadata = serviceInstanceMetadata(Map.of(), serviceMetadata, + properties); + + KubernetesClientInstanceIdHostPodNameSupplier supplierOne = externalName(service); + ServiceInstance externalNameServiceInstance = externalNameServiceInstance(serviceMetadata, supplierOne, + serviceInstanceMetadata); + serviceInstances.add(externalNameServiceInstance); + } + } + + return serviceInstances; + } + + public abstract String description(); + + @Override + public int getOrder() { + return properties.order(); + } + + @PostConstruct + void localPostConstruct() { + postConstruct(sharedInformerFactories, properties, informersReadyFunc, serviceListers); + } + + private List serviceInstances(V1Service service, String serviceId) { + + List instances = new ArrayList<>(); + + List allEndpoints = endpointsListers.stream() + .map(endpointsLister -> endpointsLister.namespace(service.getMetadata().getNamespace()).get(serviceId)) + .filter(Objects::nonNull) + .toList(); + + for (V1Endpoints endpoints : allEndpoints) { + List subsets = endpoints.getSubsets(); + if (subsets == null || subsets.isEmpty()) { + LOG.debug(() -> "serviceId : " + serviceId + " does not have any subsets"); + } + else { + ServiceMetadata serviceMetadata = serviceMetadata(service); + Map portsData = endpointSubsetsPortData(subsets); + Map serviceInstanceMetadata = serviceInstanceMetadata(portsData, serviceMetadata, + properties); + + for (V1EndpointSubset endpointSubset : subsets) { + + Map endpointsPortData = endpointSubsetsPortData(List.of(endpointSubset)); + ServicePortNameAndNumber portData = endpointsPort(endpointsPortData, serviceMetadata, properties); + + List addresses = addresses(endpointSubset, properties); + for (V1EndpointAddress endpointAddress : addresses) { + + KubernetesClientInstanceIdHostPodNameSupplier supplierOne = nonExternalName(endpointAddress, + service); + KubernetesClientPodLabelsAndAnnotationsSupplier supplierTwo = nonExternalName(coreV1Api, + service.getMetadata().getNamespace()); + + ServiceInstance serviceInstance = serviceInstance(servicePortSecureResolver, serviceMetadata, + supplierOne, supplierTwo, portData, serviceInstanceMetadata, properties); + instances.add(serviceInstance); + } + } + + } + } + + return instances; + } + +} diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerDiscoveryClient.java new file mode 100644 index 0000000000..97f28849b9 --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerDiscoveryClient.java @@ -0,0 +1,51 @@ +package org.springframework.cloud.kubernetes.client.discovery; + +import java.util.List; +import java.util.function.Predicate; + +import io.kubernetes.client.informer.SharedInformer; +import io.kubernetes.client.informer.SharedInformerFactory; +import io.kubernetes.client.informer.cache.Lister; +import io.kubernetes.client.openapi.apis.CoreV1Api; +import io.kubernetes.client.openapi.models.V1Endpoints; +import io.kubernetes.client.openapi.models.V1Service; + +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; + +/** + * @author wind57 + */ +class KubernetesClientCacheableInformerDiscoveryClient extends KubernetesClientAbstractInformerDiscoveryClient { + + KubernetesClientCacheableInformerDiscoveryClient(List sharedInformerFactories, + List> serviceListers, List> endpointsListers, + List> serviceInformers, List> endpointsInformers, + KubernetesDiscoveryProperties properties, CoreV1Api coreV1Api, Predicate predicate) { + super(sharedInformerFactories, serviceListers, endpointsListers, serviceInformers, endpointsInformers, + properties, coreV1Api, predicate); + } + + @Override + @Cacheable("k8s-native-blocking-discovery-services") + public List getServices() { + return super.getServices(); + } + + @Override + @Cacheable("k8s-native-blocking-discovery-instances") + public List getInstances(String serviceId) { + return super.getInstances(serviceId); + } + + @Override + public String description() { + return "Kubernetes Native Discovery Client"; + } + + @Override + public int getOrder() { + return super.getOrder(); + } +} diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java index 1663a6e2bb..5d0b4c1c11 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java @@ -16,208 +16,53 @@ package org.springframework.cloud.kubernetes.client.discovery; -import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.Objects; import java.util.function.Predicate; -import java.util.function.Supplier; -import java.util.stream.Collectors; import io.kubernetes.client.informer.SharedInformer; import io.kubernetes.client.informer.SharedInformerFactory; import io.kubernetes.client.informer.cache.Lister; import io.kubernetes.client.openapi.apis.CoreV1Api; -import io.kubernetes.client.openapi.models.V1EndpointAddress; -import io.kubernetes.client.openapi.models.V1EndpointSubset; import io.kubernetes.client.openapi.models.V1Endpoints; import io.kubernetes.client.openapi.models.V1Service; -import jakarta.annotation.PostConstruct; -import org.apache.commons.logging.LogFactory; import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; -import org.springframework.cloud.kubernetes.commons.discovery.ServiceMetadata; -import org.springframework.cloud.kubernetes.commons.discovery.ServicePortNameAndNumber; -import org.springframework.cloud.kubernetes.commons.discovery.ServicePortSecureResolver; -import org.springframework.core.log.LogAccessor; - -import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientDiscoveryClientUtils.addresses; -import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientDiscoveryClientUtils.endpointSubsetsPortData; -import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientDiscoveryClientUtils.matchesServiceLabels; -import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientDiscoveryClientUtils.postConstruct; -import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientDiscoveryClientUtils.serviceMetadata; -import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientInstanceIdHostPodNameSupplier.externalName; -import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientInstanceIdHostPodNameSupplier.nonExternalName; -import static org.springframework.cloud.kubernetes.client.discovery.KubernetesClientPodLabelsAndAnnotationsSupplier.nonExternalName; -import static org.springframework.cloud.kubernetes.commons.discovery.DiscoveryClientUtils.endpointsPort; -import static org.springframework.cloud.kubernetes.commons.discovery.DiscoveryClientUtils.externalNameServiceInstance; -import static org.springframework.cloud.kubernetes.commons.discovery.DiscoveryClientUtils.serviceInstance; -import static org.springframework.cloud.kubernetes.commons.discovery.DiscoveryClientUtils.serviceInstanceMetadata; -import static org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryConstants.EXTERNAL_NAME; /** * @author Min Kim * @author Ryan Baxter * @author Tim Yysewyn */ -class KubernetesClientInformerDiscoveryClient implements DiscoveryClient { - - private static final LogAccessor LOG = new LogAccessor( - LogFactory.getLog(KubernetesClientInformerDiscoveryClient.class)); - - private final List sharedInformerFactories; - - private final List> serviceListers; - - private final List> endpointsListers; - - private final Supplier informersReadyFunc; - - private final KubernetesDiscoveryProperties properties; - - private final Predicate predicate; - - private final ServicePortSecureResolver servicePortSecureResolver; - - private final CoreV1Api coreV1Api; +class KubernetesClientInformerDiscoveryClient extends KubernetesClientAbstractInformerDiscoveryClient { KubernetesClientInformerDiscoveryClient(List sharedInformerFactories, List> serviceListers, List> endpointsListers, List> serviceInformers, List> endpointsInformers, KubernetesDiscoveryProperties properties, CoreV1Api coreV1Api, Predicate predicate) { - this.sharedInformerFactories = sharedInformerFactories; - this.serviceListers = serviceListers; - this.endpointsListers = endpointsListers; - this.coreV1Api = coreV1Api; - this.properties = properties; - this.predicate = predicate; - - servicePortSecureResolver = new ServicePortSecureResolver(properties); - - this.informersReadyFunc = () -> { - boolean serviceInformersReady = serviceInformers.isEmpty() || serviceInformers.stream() - .map(SharedInformer::hasSynced) - .reduce(Boolean::logicalAnd) - .orElse(false); - boolean endpointsInformersReady = endpointsInformers.isEmpty() || endpointsInformers.stream() - .map(SharedInformer::hasSynced) - .reduce(Boolean::logicalAnd) - .orElse(false); - return serviceInformersReady && endpointsInformersReady; - }; + super(sharedInformerFactories, serviceListers, endpointsListers, serviceInformers, endpointsInformers, + properties, coreV1Api, predicate); } @Override - public String description() { - return "Kubernetes Client Discovery"; + public List getServices() { + return super.getServices(); } @Override public List getInstances(String serviceId) { - Objects.requireNonNull(serviceId, "serviceId must be provided"); - - List allServices = serviceListers.stream() - .flatMap(x -> x.list().stream()) - .filter(scv -> scv.getMetadata() != null) - .filter(svc -> serviceId.equals(svc.getMetadata().getName())) - .filter(scv -> matchesServiceLabels(scv, properties)) - .toList(); - - List serviceInstances = allServices.stream() - .filter(predicate) - .flatMap(service -> serviceInstances(service, serviceId).stream()) - .collect(Collectors.toCollection(ArrayList::new)); - - if (properties.includeExternalNameServices()) { - LOG.debug(() -> "Searching for 'ExternalName' type of services with serviceId : " + serviceId); - List externalNameServices = allServices.stream() - .filter(s -> s.getSpec() != null) - .filter(s -> EXTERNAL_NAME.equals(s.getSpec().getType())) - .toList(); - for (V1Service service : externalNameServices) { - ServiceMetadata serviceMetadata = serviceMetadata(service); - Map serviceInstanceMetadata = serviceInstanceMetadata(Map.of(), serviceMetadata, - properties); - - KubernetesClientInstanceIdHostPodNameSupplier supplierOne = externalName(service); - ServiceInstance externalNameServiceInstance = externalNameServiceInstance(serviceMetadata, supplierOne, - serviceInstanceMetadata); - serviceInstances.add(externalNameServiceInstance); - } - } - - return serviceInstances; - } - - private List serviceInstances(V1Service service, String serviceId) { - - List instances = new ArrayList<>(); - - List allEndpoints = endpointsListers.stream() - .map(endpointsLister -> endpointsLister.namespace(service.getMetadata().getNamespace()).get(serviceId)) - .filter(Objects::nonNull) - .toList(); - - for (V1Endpoints endpoints : allEndpoints) { - List subsets = endpoints.getSubsets(); - if (subsets == null || subsets.isEmpty()) { - LOG.debug(() -> "serviceId : " + serviceId + " does not have any subsets"); - } - else { - ServiceMetadata serviceMetadata = serviceMetadata(service); - Map portsData = endpointSubsetsPortData(subsets); - Map serviceInstanceMetadata = serviceInstanceMetadata(portsData, serviceMetadata, - properties); - - for (V1EndpointSubset endpointSubset : subsets) { - - Map endpointsPortData = endpointSubsetsPortData(List.of(endpointSubset)); - ServicePortNameAndNumber portData = endpointsPort(endpointsPortData, serviceMetadata, properties); - - List addresses = addresses(endpointSubset, properties); - for (V1EndpointAddress endpointAddress : addresses) { - - KubernetesClientInstanceIdHostPodNameSupplier supplierOne = nonExternalName(endpointAddress, - service); - KubernetesClientPodLabelsAndAnnotationsSupplier supplierTwo = nonExternalName(coreV1Api, - service.getMetadata().getNamespace()); - - ServiceInstance serviceInstance = serviceInstance(servicePortSecureResolver, serviceMetadata, - supplierOne, supplierTwo, portData, serviceInstanceMetadata, properties); - instances.add(serviceInstance); - } - } - - } - } - - return instances; + return super.getInstances(serviceId); } @Override - public List getServices() { - List services = serviceListers.stream() - .flatMap(serviceLister -> serviceLister.list().stream()) - .filter(service -> matchesServiceLabels(service, properties)) - .filter(predicate) - .map(s -> s.getMetadata().getName()) - .distinct() - .toList(); - LOG.debug(() -> "will return services : " + services); - return services; + public String description() { + return "Kubernetes Native Discovery Client"; } @Override public int getOrder() { - return properties.order(); - } - - @PostConstruct - void afterPropertiesSet() { - postConstruct(sharedInformerFactories, properties, informersReadyFunc, serviceListers); + return super.getOrder(); } } From 2b373c2f93f2c2b4aac4d792fdbca814177189dc Mon Sep 17 00:00:00 2001 From: wind57 Date: Mon, 13 Oct 2025 16:24:10 +0300 Subject: [PATCH 2/4] wip Signed-off-by: wind57 --- .../KubernetesClientInformerDiscoveryClient.java | 16 ---------------- ...InformerDiscoveryClientAutoConfiguration.java | 15 +++++++++++++++ ...ReactiveDiscoveryClientAutoConfiguration.java | 12 ++++++++++++ 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java index 5d0b4c1c11..75e4843f8c 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java @@ -26,7 +26,6 @@ import io.kubernetes.client.openapi.models.V1Endpoints; import io.kubernetes.client.openapi.models.V1Service; -import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; /** @@ -45,24 +44,9 @@ class KubernetesClientInformerDiscoveryClient extends KubernetesClientAbstractIn } - @Override - public List getServices() { - return super.getServices(); - } - - @Override - public List getInstances(String serviceId) { - return super.getInstances(serviceId); - } - @Override public String description() { return "Kubernetes Native Discovery Client"; } - @Override - public int getOrder() { - return super.getOrder(); - } - } diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java index 4dda10ced4..4ef376931b 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java @@ -37,6 +37,8 @@ import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryClientHealthIndicatorInitializer; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration; +import org.springframework.cloud.kubernetes.commons.discovery.conditionals.ConditionalOnDiscoveryCacheableBlockingDisabled; +import org.springframework.cloud.kubernetes.commons.discovery.conditionals.ConditionalOnDiscoveryCacheableBlockingEnabled; import org.springframework.cloud.kubernetes.commons.discovery.conditionals.ConditionalOnSpringCloudKubernetesBlockingDiscovery; import org.springframework.cloud.kubernetes.commons.discovery.conditionals.ConditionalOnSpringCloudKubernetesBlockingDiscoveryHealthInitializer; import org.springframework.context.ApplicationEventPublisher; @@ -59,6 +61,7 @@ final class KubernetesClientInformerDiscoveryClientAutoConfiguration { @Bean @ConditionalOnMissingBean + @ConditionalOnDiscoveryCacheableBlockingDisabled KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient( List sharedInformerFactories, List> serviceListers, List> endpointsListers, List> serviceInformers, @@ -68,6 +71,18 @@ KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient( serviceInformers, endpointsInformers, properties, coreV1Api, predicate); } + @Bean + @ConditionalOnMissingBean + @ConditionalOnDiscoveryCacheableBlockingEnabled + KubernetesClientInformerDiscoveryClient kubernetesClientCacheableInformerDiscoveryClient( + List sharedInformerFactories, List> serviceListers, + List> endpointsListers, List> serviceInformers, + List> endpointsInformers, KubernetesDiscoveryProperties properties, + CoreV1Api coreV1Api, Predicate predicate) { + return new KubernetesClientInformerDiscoveryClient(sharedInformerFactories, serviceListers, endpointsListers, + serviceInformers, endpointsInformers, properties, coreV1Api, predicate); + } + @Bean @ConditionalOnSpringCloudKubernetesBlockingDiscoveryHealthInitializer KubernetesDiscoveryClientHealthIndicatorInitializer indicatorInitializer( diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java index 70666fca0f..7d26bc8d8c 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java @@ -39,6 +39,9 @@ import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryClientHealthIndicatorInitializer; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration; +import org.springframework.cloud.kubernetes.commons.discovery.conditionals.ConditionalOnDiscoveryCacheableBlockingDisabled; +import org.springframework.cloud.kubernetes.commons.discovery.conditionals.ConditionalOnDiscoveryCacheableReactiveDisabled; +import org.springframework.cloud.kubernetes.commons.discovery.conditionals.ConditionalOnDiscoveryCacheableReactiveEnabled; import org.springframework.cloud.kubernetes.commons.discovery.conditionals.ConditionalOnSpringCloudKubernetesReactiveDiscovery; import org.springframework.cloud.kubernetes.commons.discovery.conditionals.ConditionalOnSpringCloudKubernetesReactiveDiscoveryHealthInitializer; import org.springframework.context.ApplicationEventPublisher; @@ -77,11 +80,20 @@ KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClientF @Bean @ConditionalOnMissingBean + @ConditionalOnDiscoveryCacheableReactiveDisabled KubernetesClientInformerReactiveDiscoveryClient kubernetesClientReactiveDiscoveryClient( KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient) { return new KubernetesClientInformerReactiveDiscoveryClient(kubernetesClientInformerDiscoveryClient); } + @Bean + @ConditionalOnMissingBean + @ConditionalOnDiscoveryCacheableReactiveEnabled + KubernetesClientInformerReactiveDiscoveryClient kubernetesClientCacheableReactiveDiscoveryClient( + KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient) { + return new KubernetesClientInformerReactiveDiscoveryClient(kubernetesClientInformerDiscoveryClient); + } + /** * Post an event so that health indicator is initialized. */ From 97fd24ed8cb04403b80c2dd977023c6b6e473779 Mon Sep 17 00:00:00 2001 From: wind57 Date: Mon, 13 Oct 2025 17:32:14 +0300 Subject: [PATCH 3/4] wip Signed-off-by: wind57 --- ...ckingAbstractInformerDiscoveryClient.java} | 24 ++++++-- ...lientCacheableInformerDiscoveryClient.java | 24 ++++++-- ...heableInformerReactiveDiscoveryClient.java | 48 +++++++++++++++ ...bernetesClientInformerDiscoveryClient.java | 3 +- ...ormerDiscoveryClientAutoConfiguration.java | 6 +- ...ClientInformerReactiveDiscoveryClient.java | 35 ++--------- ...ctiveDiscoveryClientAutoConfiguration.java | 4 +- ...activeAbstractInformerDiscoveryClient.java | 59 +++++++++++++++++++ ...oConfigurationApplicationContextTests.java | 54 +++++++++++++++++ ...DiscoveryClientAutoConfigurationTests.java | 4 +- .../Fabric8CacheableDiscoveryClient.java | 5 -- ...bric8CacheableReactiveDiscoveryClient.java | 5 -- 12 files changed, 212 insertions(+), 59 deletions(-) rename spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/{KubernetesClientAbstractInformerDiscoveryClient.java => KubernetesClientBlockingAbstractInformerDiscoveryClient.java} (89%) create mode 100644 spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerReactiveDiscoveryClient.java create mode 100644 spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientReactiveAbstractInformerDiscoveryClient.java diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientAbstractInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientBlockingAbstractInformerDiscoveryClient.java similarity index 89% rename from spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientAbstractInformerDiscoveryClient.java rename to spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientBlockingAbstractInformerDiscoveryClient.java index 519fc0ca5a..0a2fd0fef9 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientAbstractInformerDiscoveryClient.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientBlockingAbstractInformerDiscoveryClient.java @@ -1,3 +1,19 @@ +/* + * Copyright 2013-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.springframework.cloud.kubernetes.client.discovery; import java.util.ArrayList; @@ -41,10 +57,10 @@ import static org.springframework.cloud.kubernetes.commons.discovery.DiscoveryClientUtils.serviceInstanceMetadata; import static org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryConstants.EXTERNAL_NAME; -abstract class KubernetesClientAbstractInformerDiscoveryClient implements DiscoveryClient { +abstract class KubernetesClientBlockingAbstractInformerDiscoveryClient implements DiscoveryClient { private static final LogAccessor LOG = new LogAccessor( - LogFactory.getLog(KubernetesClientAbstractInformerDiscoveryClient.class)); + LogFactory.getLog(KubernetesClientBlockingAbstractInformerDiscoveryClient.class)); private final List sharedInformerFactories; @@ -62,7 +78,7 @@ abstract class KubernetesClientAbstractInformerDiscoveryClient implements Discov private final CoreV1Api coreV1Api; - KubernetesClientAbstractInformerDiscoveryClient(List sharedInformerFactories, + KubernetesClientBlockingAbstractInformerDiscoveryClient(List sharedInformerFactories, List> serviceListers, List> endpointsListers, List> serviceInformers, List> endpointsInformers, KubernetesDiscoveryProperties properties, CoreV1Api coreV1Api, Predicate predicate) { @@ -147,7 +163,7 @@ public int getOrder() { } @PostConstruct - void localPostConstruct() { + void afterPropertiesSet() { postConstruct(sharedInformerFactories, properties, informersReadyFunc, serviceListers); } diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerDiscoveryClient.java index 97f28849b9..897fe248ad 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerDiscoveryClient.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerDiscoveryClient.java @@ -1,3 +1,19 @@ +/* + * Copyright 2013-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.springframework.cloud.kubernetes.client.discovery; import java.util.List; @@ -17,7 +33,7 @@ /** * @author wind57 */ -class KubernetesClientCacheableInformerDiscoveryClient extends KubernetesClientAbstractInformerDiscoveryClient { +class KubernetesClientCacheableInformerDiscoveryClient extends KubernetesClientBlockingAbstractInformerDiscoveryClient { KubernetesClientCacheableInformerDiscoveryClient(List sharedInformerFactories, List> serviceListers, List> endpointsListers, @@ -41,11 +57,7 @@ public List getInstances(String serviceId) { @Override public String description() { - return "Kubernetes Native Discovery Client"; + return "Kubernetes Native Cacheable Discovery Client"; } - @Override - public int getOrder() { - return super.getOrder(); - } } diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerReactiveDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerReactiveDiscoveryClient.java new file mode 100644 index 0000000000..2cea77d493 --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerReactiveDiscoveryClient.java @@ -0,0 +1,48 @@ +/* + * Copyright 2013-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.kubernetes.client.discovery; + +import reactor.core.publisher.Flux; + +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cloud.client.ServiceInstance; + +class KubernetesClientCacheableInformerReactiveDiscoveryClient + extends KubernetesClientReactiveAbstractInformerDiscoveryClient{ + + KubernetesClientCacheableInformerReactiveDiscoveryClient( + KubernetesClientInformerDiscoveryClient kubernetesDiscoveryClient) { + super(kubernetesDiscoveryClient); + } + + @Override + @Cacheable("k8s-native-reactive-discovery-services") + public Flux getServices() { + return super.getServices(); + } + + @Override + @Cacheable("k8s-native-reactive-discovery-instances") + public Flux getInstances(String serviceId) { + return super.getInstances(serviceId); + } + + @Override + public String description() { + return "Kubernetes Native Cacheable Reactive Discovery Client"; + } +} diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java index 75e4843f8c..fe5a8f59e9 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java @@ -28,12 +28,13 @@ import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; + /** * @author Min Kim * @author Ryan Baxter * @author Tim Yysewyn */ -class KubernetesClientInformerDiscoveryClient extends KubernetesClientAbstractInformerDiscoveryClient { +class KubernetesClientInformerDiscoveryClient extends KubernetesClientBlockingAbstractInformerDiscoveryClient { KubernetesClientInformerDiscoveryClient(List sharedInformerFactories, List> serviceListers, List> endpointsListers, diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java index 4ef376931b..cea5264b81 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java @@ -74,13 +74,13 @@ KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient( @Bean @ConditionalOnMissingBean @ConditionalOnDiscoveryCacheableBlockingEnabled - KubernetesClientInformerDiscoveryClient kubernetesClientCacheableInformerDiscoveryClient( + KubernetesClientCacheableInformerDiscoveryClient kubernetesClientCacheableInformerDiscoveryClient( List sharedInformerFactories, List> serviceListers, List> endpointsListers, List> serviceInformers, List> endpointsInformers, KubernetesDiscoveryProperties properties, CoreV1Api coreV1Api, Predicate predicate) { - return new KubernetesClientInformerDiscoveryClient(sharedInformerFactories, serviceListers, endpointsListers, - serviceInformers, endpointsInformers, properties, coreV1Api, predicate); + return new KubernetesClientCacheableInformerDiscoveryClient(sharedInformerFactories, serviceListers, + endpointsListers, serviceInformers, endpointsInformers, properties, coreV1Api, predicate); } @Bean diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClient.java index f9a90f713c..38ffb3851d 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClient.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClient.java @@ -16,24 +16,15 @@ package org.springframework.cloud.kubernetes.client.discovery; -import java.util.Objects; - -import reactor.core.publisher.Flux; -import reactor.core.scheduler.Schedulers; - -import org.springframework.cloud.client.ServiceInstance; -import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; - /** * @author Ryan Baxter */ -public final class KubernetesClientInformerReactiveDiscoveryClient implements ReactiveDiscoveryClient { - - private final KubernetesClientInformerDiscoveryClient kubernetesDiscoveryClient; +final class KubernetesClientInformerReactiveDiscoveryClient + extends KubernetesClientReactiveAbstractInformerDiscoveryClient { - public KubernetesClientInformerReactiveDiscoveryClient( + KubernetesClientInformerReactiveDiscoveryClient( KubernetesClientInformerDiscoveryClient kubernetesDiscoveryClient) { - this.kubernetesDiscoveryClient = kubernetesDiscoveryClient; + super(kubernetesDiscoveryClient); } @Override @@ -41,22 +32,4 @@ public String description() { return "Kubernetes Reactive Discovery Client"; } - @Override - public Flux getInstances(String serviceId) { - Objects.requireNonNull(serviceId, "serviceId must be provided"); - return Flux.defer(() -> Flux.fromIterable(kubernetesDiscoveryClient.getInstances(serviceId))) - .subscribeOn(Schedulers.boundedElastic()); - } - - @Override - public Flux getServices() { - return Flux.defer(() -> Flux.fromIterable(kubernetesDiscoveryClient.getServices())) - .subscribeOn(Schedulers.boundedElastic()); - } - - @Override - public int getOrder() { - return kubernetesDiscoveryClient.getOrder(); - } - } diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java index 7d26bc8d8c..66c9574f9c 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java @@ -89,9 +89,9 @@ KubernetesClientInformerReactiveDiscoveryClient kubernetesClientReactiveDiscover @Bean @ConditionalOnMissingBean @ConditionalOnDiscoveryCacheableReactiveEnabled - KubernetesClientInformerReactiveDiscoveryClient kubernetesClientCacheableReactiveDiscoveryClient( + KubernetesClientCacheableInformerReactiveDiscoveryClient kubernetesClientCacheableReactiveDiscoveryClient( KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient) { - return new KubernetesClientInformerReactiveDiscoveryClient(kubernetesClientInformerDiscoveryClient); + return new KubernetesClientCacheableInformerReactiveDiscoveryClient(kubernetesClientInformerDiscoveryClient); } /** diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientReactiveAbstractInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientReactiveAbstractInformerDiscoveryClient.java new file mode 100644 index 0000000000..4e6eaa25ba --- /dev/null +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientReactiveAbstractInformerDiscoveryClient.java @@ -0,0 +1,59 @@ +/* + * Copyright 2019-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.kubernetes.client.discovery; + +import java.util.Objects; + +import reactor.core.publisher.Flux; +import reactor.core.scheduler.Schedulers; + +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; + +/** + * @author wind57 + */ +abstract class KubernetesClientReactiveAbstractInformerDiscoveryClient implements ReactiveDiscoveryClient { + + private final KubernetesClientInformerDiscoveryClient kubernetesDiscoveryClient; + + public KubernetesClientReactiveAbstractInformerDiscoveryClient( + KubernetesClientInformerDiscoveryClient kubernetesDiscoveryClient) { + this.kubernetesDiscoveryClient = kubernetesDiscoveryClient; + } + + public abstract String description(); + + @Override + public Flux getInstances(String serviceId) { + Objects.requireNonNull(serviceId, "serviceId must be provided"); + return Flux.defer(() -> Flux.fromIterable(kubernetesDiscoveryClient.getInstances(serviceId))) + .subscribeOn(Schedulers.boundedElastic()); + } + + @Override + public Flux getServices() { + return Flux.defer(() -> Flux.fromIterable(kubernetesDiscoveryClient.getServices())) + .subscribeOn(Schedulers.boundedElastic()); + } + + @Override + public int getOrder() { + return kubernetesDiscoveryClient.getOrder(); + } + +} diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java index b416b6db0b..f0030c62e1 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -390,6 +390,60 @@ void healthEnabledClassNotPresentWithSelectiveNamespaces() { }); } + /** + *
+	 *     - no property related to cacheable in the reactive implementation is set, as such:
+	 *     - KubernetesClientInformerReactiveDiscoveryClient is present
+	 *     - KubernetesClientCacheableInformerReactiveDiscoveryClient is not present
+	 * 
+ */ + @Test + void reactiveCacheableDefault() { + setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", + "spring.cloud.kubernetes.client.namespace=default"); + applicationContextRunner.run(context -> { + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).doesNotHaveBean(KubernetesClientCacheableInformerReactiveDiscoveryClient.class); + }); + } + + /** + *
+	 *     - cacheable in the reactive implementation = false, as such:
+	 *     - KubernetesClientInformerReactiveDiscoveryClient is present
+	 *     - KubernetesClientCacheableInformerReactiveDiscoveryClient is not present
+	 * 
+ */ + @Test + void reactiveCacheableDisabled() { + setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", + "spring.cloud.kubernetes.discovery.cacheable.reactive.enabled=false", + "spring.cloud.kubernetes.client.namespace=default"); + applicationContextRunner.run(context -> { + assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).doesNotHaveBean(KubernetesClientCacheableInformerReactiveDiscoveryClient.class); + }); + } + + /** + *
+	 *     - cacheable in the reactive implementation = true, as such:
+	 *     - KubernetesClientInformerReactiveDiscoveryClient is not present
+	 *     - KubernetesClientCacheableInformerReactiveDiscoveryClient is present
+	 * 
+ */ + @Test + void reactiveCacheableEnabled() { + setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", + "spring.cloud.kubernetes.discovery.cacheable.reactive.enabled=true", + "spring.cloud.discovery.client.health-indicator.enabled=false", + "spring.cloud.kubernetes.client.namespace=default"); + applicationContextRunner.run(context -> { + assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientCacheableInformerReactiveDiscoveryClient.class); + }); + } + private void setup(String... properties) { applicationContextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of( diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationTests.java index b54bde292c..0b32360050 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationTests.java @@ -88,12 +88,12 @@ ApiClient apiClient() { WireMock.configureFor(wireMockServer.port()); stubFor(get("/api/v1/namespaces/test/endpoints?resourceVersion=0&watch=false") .willReturn(aResponse().withStatus(200) - .withBody(new JSON().serialize(new V1EndpointsListBuilder() + .withBody(JSON.serialize(new V1EndpointsListBuilder() .withMetadata(new V1ListMetaBuilder().withResourceVersion("0").build()) .build())))); stubFor(get("/api/v1/namespaces/test/services?resourceVersion=0&watch=false") .willReturn(aResponse().withStatus(200) - .withBody(new JSON().serialize(new V1ServiceListBuilder() + .withBody(JSON.serialize(new V1ServiceListBuilder() .withMetadata(new V1ListMetaBuilder().withResourceVersion("0").build()) .build())))); return new ClientBuilder().setBasePath(wireMockServer.baseUrl()).build(); diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8CacheableDiscoveryClient.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8CacheableDiscoveryClient.java index b44571631e..ccabcb7aa6 100644 --- a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8CacheableDiscoveryClient.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8CacheableDiscoveryClient.java @@ -62,9 +62,4 @@ public String description() { return "Fabric8 Cacheable Blocking Discovery Client"; } - @Override - public int getOrder() { - return super.getOrder(); - } - } diff --git a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8CacheableReactiveDiscoveryClient.java b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8CacheableReactiveDiscoveryClient.java index aafbc037c8..000107e7c9 100644 --- a/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8CacheableReactiveDiscoveryClient.java +++ b/spring-cloud-kubernetes-fabric8-discovery/src/main/java/org/springframework/cloud/kubernetes/fabric8/discovery/Fabric8CacheableReactiveDiscoveryClient.java @@ -47,9 +47,4 @@ public String description() { return "Fabric8 Cacheable Reactive Discovery Client"; } - @Override - public int getOrder() { - return super.getOrder(); - } - } From c069fa9d76653c662f58efa20a6f98ebf103b861 Mon Sep 17 00:00:00 2001 From: wind57 Date: Mon, 13 Oct 2025 18:12:19 +0300 Subject: [PATCH 4/4] fix Signed-off-by: wind57 --- ...ockingAbstractInformerDiscoveryClient.java | 20 +++---- ...lientCacheableInformerDiscoveryClient.java | 8 +-- ...heableInformerReactiveDiscoveryClient.java | 5 +- ...bernetesClientInformerDiscoveryClient.java | 3 +- ...ormerDiscoveryClientAutoConfiguration.java | 10 ++-- ...ClientInformerReactiveDiscoveryClient.java | 4 +- ...ctiveDiscoveryClientAutoConfiguration.java | 3 +- ...activeAbstractInformerDiscoveryClient.java | 4 +- ...oConfigurationApplicationContextTests.java | 53 +++++++++++++++++++ ...oConfigurationApplicationContextTests.java | 12 ++--- 10 files changed, 87 insertions(+), 35 deletions(-) diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientBlockingAbstractInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientBlockingAbstractInformerDiscoveryClient.java index 0a2fd0fef9..a63272f491 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientBlockingAbstractInformerDiscoveryClient.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientBlockingAbstractInformerDiscoveryClient.java @@ -60,7 +60,7 @@ abstract class KubernetesClientBlockingAbstractInformerDiscoveryClient implements DiscoveryClient { private static final LogAccessor LOG = new LogAccessor( - LogFactory.getLog(KubernetesClientBlockingAbstractInformerDiscoveryClient.class)); + LogFactory.getLog(KubernetesClientBlockingAbstractInformerDiscoveryClient.class)); private final List sharedInformerFactories; @@ -79,9 +79,9 @@ abstract class KubernetesClientBlockingAbstractInformerDiscoveryClient implement private final CoreV1Api coreV1Api; KubernetesClientBlockingAbstractInformerDiscoveryClient(List sharedInformerFactories, - List> serviceListers, List> endpointsListers, - List> serviceInformers, List> endpointsInformers, - KubernetesDiscoveryProperties properties, CoreV1Api coreV1Api, Predicate predicate) { + List> serviceListers, List> endpointsListers, + List> serviceInformers, List> endpointsInformers, + KubernetesDiscoveryProperties properties, CoreV1Api coreV1Api, Predicate predicate) { this.sharedInformerFactories = sharedInformerFactories; this.serviceListers = serviceListers; this.endpointsListers = endpointsListers; @@ -143,11 +143,11 @@ public List getInstances(String serviceId) { for (V1Service service : externalNameServices) { ServiceMetadata serviceMetadata = serviceMetadata(service); Map serviceInstanceMetadata = serviceInstanceMetadata(Map.of(), serviceMetadata, - properties); + properties); KubernetesClientInstanceIdHostPodNameSupplier supplierOne = externalName(service); ServiceInstance externalNameServiceInstance = externalNameServiceInstance(serviceMetadata, supplierOne, - serviceInstanceMetadata); + serviceInstanceMetadata); serviceInstances.add(externalNameServiceInstance); } } @@ -185,7 +185,7 @@ private List serviceInstances(V1Service service, String service ServiceMetadata serviceMetadata = serviceMetadata(service); Map portsData = endpointSubsetsPortData(subsets); Map serviceInstanceMetadata = serviceInstanceMetadata(portsData, serviceMetadata, - properties); + properties); for (V1EndpointSubset endpointSubset : subsets) { @@ -196,12 +196,12 @@ private List serviceInstances(V1Service service, String service for (V1EndpointAddress endpointAddress : addresses) { KubernetesClientInstanceIdHostPodNameSupplier supplierOne = nonExternalName(endpointAddress, - service); + service); KubernetesClientPodLabelsAndAnnotationsSupplier supplierTwo = nonExternalName(coreV1Api, - service.getMetadata().getNamespace()); + service.getMetadata().getNamespace()); ServiceInstance serviceInstance = serviceInstance(servicePortSecureResolver, serviceMetadata, - supplierOne, supplierTwo, portData, serviceInstanceMetadata, properties); + supplierOne, supplierTwo, portData, serviceInstanceMetadata, properties); instances.add(serviceInstance); } } diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerDiscoveryClient.java index 897fe248ad..28550a6454 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerDiscoveryClient.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerDiscoveryClient.java @@ -36,11 +36,11 @@ class KubernetesClientCacheableInformerDiscoveryClient extends KubernetesClientBlockingAbstractInformerDiscoveryClient { KubernetesClientCacheableInformerDiscoveryClient(List sharedInformerFactories, - List> serviceListers, List> endpointsListers, - List> serviceInformers, List> endpointsInformers, - KubernetesDiscoveryProperties properties, CoreV1Api coreV1Api, Predicate predicate) { + List> serviceListers, List> endpointsListers, + List> serviceInformers, List> endpointsInformers, + KubernetesDiscoveryProperties properties, CoreV1Api coreV1Api, Predicate predicate) { super(sharedInformerFactories, serviceListers, endpointsListers, serviceInformers, endpointsInformers, - properties, coreV1Api, predicate); + properties, coreV1Api, predicate); } @Override diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerReactiveDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerReactiveDiscoveryClient.java index 2cea77d493..c4a8249d35 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerReactiveDiscoveryClient.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientCacheableInformerReactiveDiscoveryClient.java @@ -22,10 +22,10 @@ import org.springframework.cloud.client.ServiceInstance; class KubernetesClientCacheableInformerReactiveDiscoveryClient - extends KubernetesClientReactiveAbstractInformerDiscoveryClient{ + extends KubernetesClientReactiveAbstractInformerDiscoveryClient { KubernetesClientCacheableInformerReactiveDiscoveryClient( - KubernetesClientInformerDiscoveryClient kubernetesDiscoveryClient) { + KubernetesClientInformerDiscoveryClient kubernetesDiscoveryClient) { super(kubernetesDiscoveryClient); } @@ -45,4 +45,5 @@ public Flux getInstances(String serviceId) { public String description() { return "Kubernetes Native Cacheable Reactive Discovery Client"; } + } diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java index fe5a8f59e9..c69ace9fc6 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClient.java @@ -28,7 +28,6 @@ import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; - /** * @author Min Kim * @author Ryan Baxter @@ -41,7 +40,7 @@ class KubernetesClientInformerDiscoveryClient extends KubernetesClientBlockingAb List> serviceInformers, List> endpointsInformers, KubernetesDiscoveryProperties properties, CoreV1Api coreV1Api, Predicate predicate) { super(sharedInformerFactories, serviceListers, endpointsListers, serviceInformers, endpointsInformers, - properties, coreV1Api, predicate); + properties, coreV1Api, predicate); } diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java index cea5264b81..be4ba95330 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfiguration.java @@ -75,12 +75,12 @@ KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient( @ConditionalOnMissingBean @ConditionalOnDiscoveryCacheableBlockingEnabled KubernetesClientCacheableInformerDiscoveryClient kubernetesClientCacheableInformerDiscoveryClient( - List sharedInformerFactories, List> serviceListers, - List> endpointsListers, List> serviceInformers, - List> endpointsInformers, KubernetesDiscoveryProperties properties, - CoreV1Api coreV1Api, Predicate predicate) { + List sharedInformerFactories, List> serviceListers, + List> endpointsListers, List> serviceInformers, + List> endpointsInformers, KubernetesDiscoveryProperties properties, + CoreV1Api coreV1Api, Predicate predicate) { return new KubernetesClientCacheableInformerDiscoveryClient(sharedInformerFactories, serviceListers, - endpointsListers, serviceInformers, endpointsInformers, properties, coreV1Api, predicate); + endpointsListers, serviceInformers, endpointsInformers, properties, coreV1Api, predicate); } @Bean diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClient.java index 38ffb3851d..962b4c03f0 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClient.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClient.java @@ -19,10 +19,10 @@ /** * @author Ryan Baxter */ -final class KubernetesClientInformerReactiveDiscoveryClient +public final class KubernetesClientInformerReactiveDiscoveryClient extends KubernetesClientReactiveAbstractInformerDiscoveryClient { - KubernetesClientInformerReactiveDiscoveryClient( + public KubernetesClientInformerReactiveDiscoveryClient( KubernetesClientInformerDiscoveryClient kubernetesDiscoveryClient) { super(kubernetesDiscoveryClient); } diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java index 66c9574f9c..65e54cd141 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfiguration.java @@ -39,7 +39,6 @@ import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryClientHealthIndicatorInitializer; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryPropertiesAutoConfiguration; -import org.springframework.cloud.kubernetes.commons.discovery.conditionals.ConditionalOnDiscoveryCacheableBlockingDisabled; import org.springframework.cloud.kubernetes.commons.discovery.conditionals.ConditionalOnDiscoveryCacheableReactiveDisabled; import org.springframework.cloud.kubernetes.commons.discovery.conditionals.ConditionalOnDiscoveryCacheableReactiveEnabled; import org.springframework.cloud.kubernetes.commons.discovery.conditionals.ConditionalOnSpringCloudKubernetesReactiveDiscovery; @@ -90,7 +89,7 @@ KubernetesClientInformerReactiveDiscoveryClient kubernetesClientReactiveDiscover @ConditionalOnMissingBean @ConditionalOnDiscoveryCacheableReactiveEnabled KubernetesClientCacheableInformerReactiveDiscoveryClient kubernetesClientCacheableReactiveDiscoveryClient( - KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient) { + KubernetesClientInformerDiscoveryClient kubernetesClientInformerDiscoveryClient) { return new KubernetesClientCacheableInformerReactiveDiscoveryClient(kubernetesClientInformerDiscoveryClient); } diff --git a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientReactiveAbstractInformerDiscoveryClient.java b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientReactiveAbstractInformerDiscoveryClient.java index 4e6eaa25ba..99709cc785 100644 --- a/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientReactiveAbstractInformerDiscoveryClient.java +++ b/spring-cloud-kubernetes-client-discovery/src/main/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientReactiveAbstractInformerDiscoveryClient.java @@ -31,8 +31,8 @@ abstract class KubernetesClientReactiveAbstractInformerDiscoveryClient implement private final KubernetesClientInformerDiscoveryClient kubernetesDiscoveryClient; - public KubernetesClientReactiveAbstractInformerDiscoveryClient( - KubernetesClientInformerDiscoveryClient kubernetesDiscoveryClient) { + KubernetesClientReactiveAbstractInformerDiscoveryClient( + KubernetesClientInformerDiscoveryClient kubernetesDiscoveryClient) { this.kubernetesDiscoveryClient = kubernetesDiscoveryClient; } diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java index 2608fc71e2..b9abe6808b 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -469,6 +469,59 @@ void reactiveDisabledWithSelectiveNamespaces() { }); } + /** + *
+	 *     - no property related to cacheable in the blocking implementation is set, as such:
+	 *     - KubernetesClientInformerDiscoveryClient is present
+	 *     - KubernetesClientCacheableInformerDiscoveryClient is not present
+	 * 
+ */ + @Test + void blockingCacheableDefault() { + setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", + "spring.cloud.kubernetes.client.namespace=default"); + applicationContextRunner.run(context -> { + assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); + assertThat(context).doesNotHaveBean(KubernetesClientCacheableInformerDiscoveryClient.class); + }); + } + + /** + *
+	 *     - cacheable in the blocking implementation = false, as such:
+	 *     - KubernetesClientInformerDiscoveryClient is present
+	 *     - KubernetesClientCacheableInformerDiscoveryClient is not present
+	 * 
+ */ + @Test + void blockingCacheableDisabled() { + setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", + "spring.cloud.kubernetes.discovery.cacheable.blocking.enabled=false", + "spring.cloud.kubernetes.client.namespace=default"); + applicationContextRunner.run(context -> { + assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); + assertThat(context).doesNotHaveBean(KubernetesClientCacheableInformerDiscoveryClient.class); + }); + } + + /** + *
+	 *     - cacheable in the blocking implementation = true, as such:
+	 *     - KubernetesClientInformerDiscoveryClient is not present
+	 *     - KubernetesClientCacheableInformerDiscoveryClient is present
+	 * 
+ */ + @Test + void blockingCacheableEnabled() { + setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", + "spring.cloud.kubernetes.discovery.cacheable.blocking.enabled=true", + "spring.cloud.kubernetes.client.namespace=default"); + applicationContextRunner.run(context -> { + assertThat(context).hasSingleBean(KubernetesClientInformerDiscoveryClient.class); + assertThat(context).hasSingleBean(KubernetesClientCacheableInformerDiscoveryClient.class); + }); + } + private void setup(String... properties) { applicationContextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of( diff --git a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java index f0030c62e1..8321a615b1 100644 --- a/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java +++ b/spring-cloud-kubernetes-client-discovery/src/test/java/org/springframework/cloud/kubernetes/client/discovery/KubernetesClientInformerReactiveDiscoveryClientAutoConfigurationApplicationContextTests.java @@ -400,7 +400,7 @@ void healthEnabledClassNotPresentWithSelectiveNamespaces() { @Test void reactiveCacheableDefault() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.kubernetes.client.namespace=default"); + "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).doesNotHaveBean(KubernetesClientCacheableInformerReactiveDiscoveryClient.class); @@ -417,8 +417,8 @@ void reactiveCacheableDefault() { @Test void reactiveCacheableDisabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.kubernetes.discovery.cacheable.reactive.enabled=false", - "spring.cloud.kubernetes.client.namespace=default"); + "spring.cloud.kubernetes.discovery.cacheable.reactive.enabled=false", + "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).hasSingleBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).doesNotHaveBean(KubernetesClientCacheableInformerReactiveDiscoveryClient.class); @@ -435,9 +435,9 @@ void reactiveCacheableDisabled() { @Test void reactiveCacheableEnabled() { setup("spring.main.cloud-platform=KUBERNETES", "spring.cloud.config.enabled=false", - "spring.cloud.kubernetes.discovery.cacheable.reactive.enabled=true", - "spring.cloud.discovery.client.health-indicator.enabled=false", - "spring.cloud.kubernetes.client.namespace=default"); + "spring.cloud.kubernetes.discovery.cacheable.reactive.enabled=true", + "spring.cloud.discovery.client.health-indicator.enabled=false", + "spring.cloud.kubernetes.client.namespace=default"); applicationContextRunner.run(context -> { assertThat(context).doesNotHaveBean(KubernetesClientInformerReactiveDiscoveryClient.class); assertThat(context).hasSingleBean(KubernetesClientCacheableInformerReactiveDiscoveryClient.class);