diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/Service.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/Service.java new file mode 100644 index 00000000..1fa2db1e --- /dev/null +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/discovery/Service.java @@ -0,0 +1,26 @@ +/* + * Copyright 2013-2023 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.commons.discovery; + +import java.util.List; + +/** + * Use for discovery service implementation. + * @author wind57 + */ +public record Service(String name, List serviceInstances) { +} diff --git a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-discoveryserver/src/main/java/org/springframework/cloud/kubernetes/discoveryserver/DiscoveryServerController.java b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-discoveryserver/src/main/java/org/springframework/cloud/kubernetes/discoveryserver/DiscoveryServerController.java index edcf169a..2671256e 100644 --- a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-discoveryserver/src/main/java/org/springframework/cloud/kubernetes/discoveryserver/DiscoveryServerController.java +++ b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-discoveryserver/src/main/java/org/springframework/cloud/kubernetes/discoveryserver/DiscoveryServerController.java @@ -16,13 +16,13 @@ package org.springframework.cloud.kubernetes.discoveryserver; -import java.util.List; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.kubernetes.client.discovery.reactive.KubernetesInformerReactiveDiscoveryClient; +import org.springframework.cloud.kubernetes.commons.discovery.DefaultKubernetesServiceInstance; +import org.springframework.cloud.kubernetes.commons.discovery.Service; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @@ -41,8 +41,10 @@ public class DiscoveryServerController { @GetMapping("/apps") public Flux apps() { - return reactiveDiscoveryClient.getServices().flatMap(service -> reactiveDiscoveryClient.getInstances(service) - .collectList().flatMap(serviceInstances -> Mono.just(new Service(service, serviceInstances)))); + return reactiveDiscoveryClient.getServices() + .flatMap(service -> reactiveDiscoveryClient.getInstances(service).collectList() + .flatMap(serviceInstances -> Mono.just(new Service(service, + serviceInstances.stream().map(x -> (DefaultKubernetesServiceInstance) x).toList())))); } @GetMapping("/apps/{name}") @@ -56,8 +58,4 @@ public class DiscoveryServerController { .filter(serviceInstance -> serviceInstance.getInstanceId().equals(instanceId)).singleOrEmpty(); } - record Service(String name, List serviceInstances) { - - } - } diff --git a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-discoveryserver/src/test/java/org/springframework/cloud/kubernetes/discoveryserver/DiscoveryServerControllerTests.java b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-discoveryserver/src/test/java/org/springframework/cloud/kubernetes/discoveryserver/DiscoveryServerControllerTests.java index 8980f23b..abcf5f13 100644 --- a/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-discoveryserver/src/test/java/org/springframework/cloud/kubernetes/discoveryserver/DiscoveryServerControllerTests.java +++ b/spring-cloud-kubernetes-controllers/spring-cloud-kubernetes-discoveryserver/src/test/java/org/springframework/cloud/kubernetes/discoveryserver/DiscoveryServerControllerTests.java @@ -29,7 +29,7 @@ import reactor.test.StepVerifier; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.kubernetes.client.discovery.reactive.KubernetesInformerReactiveDiscoveryClient; import org.springframework.cloud.kubernetes.commons.discovery.DefaultKubernetesServiceInstance; -import org.springframework.cloud.kubernetes.commons.discovery.KubernetesServiceInstance; +import org.springframework.cloud.kubernetes.commons.discovery.Service; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; @@ -40,26 +40,26 @@ import static org.mockito.Mockito.when; */ class DiscoveryServerControllerTests { - private static final KubernetesServiceInstance SERVICE_A_INSTANCE_1 = new DefaultKubernetesServiceInstance( + private static final DefaultKubernetesServiceInstance SERVICE_A_INSTANCE_1 = new DefaultKubernetesServiceInstance( "serviceAInstance1", "serviceAInstance1", "2.2.2.2", 8080, Map.of(), false, "namespace1", null); - private static final KubernetesServiceInstance SERVICE_A_INSTANCE_2 = new DefaultKubernetesServiceInstance( + private static final DefaultKubernetesServiceInstance SERVICE_A_INSTANCE_2 = new DefaultKubernetesServiceInstance( "serviceAInstance2", "serviceAInstance2", "2.2.2.2", 8080, Map.of(), false, "namespace1", null); - private static final KubernetesServiceInstance SERVICE_A_INSTANCE_3 = new DefaultKubernetesServiceInstance( + private static final DefaultKubernetesServiceInstance SERVICE_A_INSTANCE_3 = new DefaultKubernetesServiceInstance( "serviceAInstance3", "serviceAInstance3", "2.2.2.2", 8080, Map.of(), false, "namespace2", null); - private static final KubernetesServiceInstance SERVICE_B_INSTANCE_1 = new DefaultKubernetesServiceInstance( + private static final DefaultKubernetesServiceInstance SERVICE_B_INSTANCE_1 = new DefaultKubernetesServiceInstance( "serviceBInstance1", "serviceBInstance1", "2.2.2.2", 8080, Map.of(), false, "namespace1", null); - private static final KubernetesServiceInstance SERVICE_C_INSTANCE_1 = new DefaultKubernetesServiceInstance( + private static final DefaultKubernetesServiceInstance SERVICE_C_INSTANCE_1 = new DefaultKubernetesServiceInstance( "serviceCInstance1", "serviceCInstance1", "2.2.2.2", 8080, Map.of(), false, "namespace2", null); - private static DiscoveryServerController.Service serviceA; + private static Service serviceA; - private static DiscoveryServerController.Service serviceB; + private static Service serviceB; - private static DiscoveryServerController.Service serviceC; + private static Service serviceC; private static KubernetesInformerReactiveDiscoveryClient discoveryClient; @@ -67,17 +67,17 @@ class DiscoveryServerControllerTests { static void beforeAll() { Flux services = Flux.just("serviceA", "serviceB", "serviceC"); - List serviceAInstanceList = new ArrayList<>(); + List serviceAInstanceList = new ArrayList<>(); serviceAInstanceList.add(SERVICE_A_INSTANCE_1); serviceAInstanceList.add(SERVICE_A_INSTANCE_2); serviceAInstanceList.add(SERVICE_A_INSTANCE_3); Flux serviceAInstances = Flux.fromIterable(serviceAInstanceList); - List serviceBInstanceList = Collections.singletonList(SERVICE_B_INSTANCE_1); + List serviceBInstanceList = Collections.singletonList(SERVICE_B_INSTANCE_1); Flux serviceBInstances = Flux.fromIterable(serviceBInstanceList); - List serviceCInstanceList = Collections.singletonList(SERVICE_C_INSTANCE_1); + List serviceCInstanceList = Collections.singletonList(SERVICE_C_INSTANCE_1); Flux serviceCInstances = Flux.fromIterable(serviceCInstanceList); discoveryClient = mock(KubernetesInformerReactiveDiscoveryClient.class); @@ -87,9 +87,9 @@ class DiscoveryServerControllerTests { when(discoveryClient.getInstances(eq("serviceC"))).thenReturn(serviceCInstances); when(discoveryClient.getInstances(eq("serviceD"))).thenReturn(Flux.empty()); - serviceA = new DiscoveryServerController.Service("serviceA", serviceAInstanceList); - serviceB = new DiscoveryServerController.Service("serviceB", serviceBInstanceList); - serviceC = new DiscoveryServerController.Service("serviceC", serviceCInstanceList); + serviceA = new Service("serviceA", serviceAInstanceList); + serviceB = new Service("serviceB", serviceBInstanceList); + serviceC = new Service("serviceC", serviceCInstanceList); } diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClient.java b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClient.java index 7dceae2c..815ac43e 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClient.java +++ b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClient.java @@ -23,7 +23,9 @@ import java.util.stream.Collectors; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.kubernetes.commons.discovery.DefaultKubernetesServiceInstance; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.Service; import org.springframework.util.StringUtils; import org.springframework.web.client.RestTemplate; @@ -68,8 +70,9 @@ public class KubernetesDiscoveryClient implements DiscoveryClient { @Override public List getInstances(String serviceId) { - KubernetesServiceInstance[] responseBody = rest - .getForEntity(discoveryServerUrl + "/apps/" + serviceId, KubernetesServiceInstance[].class).getBody(); + DefaultKubernetesServiceInstance[] responseBody = rest + .getForEntity(discoveryServerUrl + "/apps/" + serviceId, DefaultKubernetesServiceInstance[].class) + .getBody(); if (responseBody != null && responseBody.length > 0) { return Arrays.stream(responseBody).filter(this::matchNamespaces).collect(Collectors.toList()); } @@ -80,18 +83,18 @@ public class KubernetesDiscoveryClient implements DiscoveryClient { public List getServices() { Service[] services = rest.getForEntity(discoveryServerUrl + "/apps", Service[].class).getBody(); if (services != null && services.length > 0) { - return Arrays.stream(services).filter(this::matchNamespaces).map(Service::getName).toList(); + return Arrays.stream(services).filter(this::matchNamespaces).map(Service::name).toList(); } return List.of(); } - private boolean matchNamespaces(KubernetesServiceInstance kubernetesServiceInstance) { + private boolean matchNamespaces(DefaultKubernetesServiceInstance kubernetesServiceInstance) { return emptyNamespaces || namespaces.contains(kubernetesServiceInstance.getNamespace()); } private boolean matchNamespaces(Service service) { - return service.getServiceInstances().isEmpty() - || service.getServiceInstances().stream().anyMatch(this::matchNamespaces); + return service.serviceInstances().isEmpty() + || service.serviceInstances().stream().anyMatch(this::matchNamespaces); } } diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesReactiveDiscoveryClient.java b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesReactiveDiscoveryClient.java index f61db974..c9376dc3 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesReactiveDiscoveryClient.java +++ b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesReactiveDiscoveryClient.java @@ -21,7 +21,9 @@ import reactor.core.publisher.Flux; import org.springframework.cache.annotation.Cacheable; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient; +import org.springframework.cloud.kubernetes.commons.discovery.DefaultKubernetesServiceInstance; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; +import org.springframework.cloud.kubernetes.commons.discovery.Service; import org.springframework.util.StringUtils; import org.springframework.web.reactive.function.client.WebClient; @@ -57,14 +59,14 @@ public class KubernetesReactiveDiscoveryClient implements ReactiveDiscoveryClien @Cacheable("serviceinstances") public Flux getInstances(String serviceId) { return webClient.get().uri("/apps/" + serviceId) - .exchangeToFlux(clientResponse -> clientResponse.bodyToFlux(KubernetesServiceInstance.class)); + .exchangeToFlux(clientResponse -> clientResponse.bodyToFlux(DefaultKubernetesServiceInstance.class)); } @Override @Cacheable("services") public Flux getServices() { - return webClient.get().uri("/apps").exchangeToFlux( - clientResponse -> clientResponse.bodyToFlux(Service.class).map(service -> service.getName())); + return webClient.get().uri("/apps") + .exchangeToFlux(clientResponse -> clientResponse.bodyToFlux(Service.class).map(Service::name)); } } diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesServiceInstance.java b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesServiceInstance.java index f397da60..370d8c02 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesServiceInstance.java +++ b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/KubernetesServiceInstance.java @@ -25,6 +25,7 @@ import org.springframework.cloud.client.ServiceInstance; /** * @author Ryan Baxter */ +@Deprecated(forRemoval = true) public class KubernetesServiceInstance implements ServiceInstance { private String instanceId; diff --git a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/Service.java b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/Service.java index 59f09f10..43c97c87 100644 --- a/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/Service.java +++ b/spring-cloud-kubernetes-discovery/src/main/java/org/springframework/cloud/kubernetes/discovery/Service.java @@ -21,6 +21,7 @@ import java.util.List; /** * @author Ryan Baxter */ +@Deprecated(forRemoval = true) public class Service { private String name; diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientTests.java b/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientTests.java index ef9ba4be..2f97f56e 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientTests.java +++ b/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesDiscoveryClientTests.java @@ -16,7 +16,6 @@ package org.springframework.cloud.kubernetes.discovery; -import java.net.URI; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -33,6 +32,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.kubernetes.commons.discovery.DefaultKubernetesServiceInstance; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.web.client.RestTemplate; @@ -133,9 +133,8 @@ class KubernetesDiscoveryClientTests { metadata.put("spring", "true"); metadata.put("http", "8080"); metadata.put("k8s", "true"); - assertThat(discoveryClient.getInstances("test-svc-3")) - .contains(new KubernetesServiceInstance("uid2", "test-svc-3", "2.2.2.2", 8080, false, - URI.create("http://2.2.2.2:8080"), metadata, "http", "namespace2")); + assertThat(discoveryClient.getInstances("test-svc-3")).contains(new DefaultKubernetesServiceInstance("uid2", + "test-svc-3", "2.2.2.2", 8080, metadata, false, "namespace2", null, null)); assertThat(discoveryClient.getInstances("does-not-exist")).isEmpty(); } diff --git a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesReactiveDiscoveryClientTests.java b/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesReactiveDiscoveryClientTests.java index af6bf025..91b509ba 100644 --- a/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesReactiveDiscoveryClientTests.java +++ b/spring-cloud-kubernetes-discovery/src/test/java/org/springframework/cloud/kubernetes/discovery/KubernetesReactiveDiscoveryClientTests.java @@ -16,7 +16,6 @@ package org.springframework.cloud.kubernetes.discovery; -import java.net.URI; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -27,6 +26,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import reactor.test.StepVerifier; +import org.springframework.cloud.kubernetes.commons.discovery.DefaultKubernetesServiceInstance; import org.springframework.cloud.kubernetes.commons.discovery.KubernetesDiscoveryProperties; import org.springframework.web.reactive.function.client.WebClient; @@ -127,11 +127,11 @@ class KubernetesReactiveDiscoveryClientTests { metadata.put("spring", "true"); metadata.put("http", "8080"); metadata.put("k8s", "true"); + StepVerifier.create(discoveryClient.getInstances("test-svc-3")) - .expectNext(new KubernetesServiceInstance("uid2", "test-svc-3", "2.2.2.2", 8080, false, - URI.create("http://2.2.2.2:8080"), metadata, "http", "namespace1")) + .expectNext(new DefaultKubernetesServiceInstance("uid2", "test-svc-3", "2.2.2.2", 8080, metadata, false, + "namespace1", null, null)) .verifyComplete(); - StepVerifier.create(discoveryClient.getInstances("test-svc-3")).expectNextCount(0); } }