Adds ServiceInstance metadata to RouteDefenition in DiscoveryClientRouteDefenitionLocator.

fixes gh-1555
This commit is contained in:
trotman23
2020-02-04 17:41:10 -06:00
committed by Spencer Gibb
parent 070c4be396
commit 35eab962a1
2 changed files with 16 additions and 6 deletions

View File

@@ -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<String, String> entry) {
try {

View File

@@ -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);