From 35eab962a168d1fe6edc341612dca5c5c96b5a3c Mon Sep 17 00:00:00 2001 From: trotman23 Date: Tue, 4 Feb 2020 17:41:10 -0600 Subject: [PATCH] Adds ServiceInstance metadata to RouteDefenition in DiscoveryClientRouteDefenitionLocator. fixes gh-1555 --- ...DiscoveryClientRouteDefinitionLocator.java | 21 +++++++++++++------ ...veryClientRouteDefinitionLocatorTests.java | 1 + 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocator.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocator.java index 8109fc18..0ad99d41 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocator.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocator.java @@ -17,6 +17,7 @@ package org.springframework.cloud.gateway.discovery; import java.net.URI; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.function.Predicate; @@ -121,12 +122,8 @@ public class DiscoveryClientRouteDefinitionLocator implements RouteDefinitionLoc return serviceInstances.filter(instances -> !instances.isEmpty()) .map(instances -> instances.get(0)).filter(includePredicate) .map(instance -> { - String serviceId = instance.getServiceId(); - - RouteDefinition routeDefinition = new RouteDefinition(); - routeDefinition.setId(this.routeIdPrefix + serviceId); - String uri = urlExpr.getValue(evalCtxt, instance, String.class); - routeDefinition.setUri(URI.create(uri)); + RouteDefinition routeDefinition = buildRouteDefinition(urlExpr, + instance); final ServiceInstance instanceForEval = new DelegatingServiceInstance( instance, properties); @@ -159,6 +156,18 @@ public class DiscoveryClientRouteDefinitionLocator implements RouteDefinitionLoc }); } + protected RouteDefinition buildRouteDefinition(Expression urlExpr, + ServiceInstance serviceInstance) { + String serviceId = serviceInstance.getServiceId(); + RouteDefinition routeDefinition = new RouteDefinition(); + routeDefinition.setId(this.routeIdPrefix + serviceId); + String uri = urlExpr.getValue(this.evalCtxt, serviceInstance, String.class); + routeDefinition.setUri(URI.create(uri)); + // add instance metadata + routeDefinition.setMetadata(new LinkedHashMap<>(serviceInstance.getMetadata())); + return routeDefinition; + } + String getValueFromExpr(SimpleEvaluationContext evalCtxt, SpelExpressionParser parser, ServiceInstance instance, Map.Entry entry) { try { diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocatorTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocatorTests.java index 412763aa..194312ab 100644 --- a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocatorTests.java +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/discovery/DiscoveryClientRouteDefinitionLocatorTests.java @@ -75,6 +75,7 @@ public class DiscoveryClientRouteDefinitionLocatorTests { RouteDefinition definition = definitions.get(0); assertThat(definition.getId()).isEqualTo("testedge_SERVICE1"); assertThat(definition.getUri()).hasScheme("lb").hasHost("SERVICE1"); + assertThat(definition.getMetadata()).containsEntry("edge", "true"); assertThat(definition.getPredicates()).hasSize(1); PredicateDefinition predicate = definition.getPredicates().get(0);