From ef67fa328cca8fd56c852baa2bf93c0977c1a7a1 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Fri, 9 Oct 2015 16:14:34 -0600 Subject: [PATCH] Add local service to zuul ignoredServices by default. fixes gh-447 --- .../zuul/filters/ProxyRouteLocator.java | 13 ++++- .../netflix/zuul/filters/ZuulProperties.java | 2 + .../zuul/filters/ProxyRouteLocatorTests.java | 58 +++++++++++++++---- 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocator.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocator.java index 857e32b3..f3a062f6 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocator.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocator.java @@ -27,6 +27,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.extern.apachecommons.CommonsLog; +import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.ZuulRoute; import org.springframework.util.AntPathMatcher; @@ -62,7 +63,17 @@ public class ProxyRouteLocator implements RouteLocator { //set Zuul servlet path this.servletPath = properties.getServletPath() != null? properties.getServletPath() : ""; } - + + if (properties.isIgnoreLocalService()) { + ServiceInstance instance = discovery.getLocalServiceInstance(); + if (instance != null) { + String localServiceId = instance.getServiceId(); + if (!properties.getIgnoredServices().contains(localServiceId)) { + properties.getIgnoredServices().add(localServiceId); + } + } + } + this.discovery = discovery; this.properties = properties; } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java index 7e7a57e0..a5a2a4be 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java @@ -55,6 +55,8 @@ public class ZuulProperties { private String servletPath = "/zuul"; + private boolean ignoreLocalService = true; + @PostConstruct public void init() { for (Entry entry : this.routes.entrySet()) { diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocatorTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocatorTests.java index 4e92dfd8..22a96078 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocatorTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocatorTests.java @@ -16,18 +16,6 @@ package org.springframework.cloud.netflix.zuul.filters; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; - -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mock; -import org.springframework.cloud.client.discovery.DiscoveryClient; -import org.springframework.cloud.netflix.zuul.filters.ProxyRouteLocator.ProxyRouteSpec; -import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.ZuulRoute; -import org.springframework.core.env.ConfigurableEnvironment; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -36,6 +24,19 @@ import static org.junit.Assert.assertTrue; import static org.mockito.BDDMockito.given; import static org.mockito.MockitoAnnotations.initMocks; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mock; +import org.springframework.cloud.client.DefaultServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.netflix.zuul.filters.ProxyRouteLocator.ProxyRouteSpec; +import org.springframework.cloud.netflix.zuul.filters.ZuulProperties.ZuulRoute; +import org.springframework.core.env.ConfigurableEnvironment; + /** * @author Spencer Gibb * @author Dave Syer @@ -485,6 +486,39 @@ public class ProxyRouteLocatorTests { assertMapping(routesMap, "http://example.com/" + MYSERVICE, MYSERVICE); } + @Test + public void testIgnoredLocalServiceByDefault() { + given(this.discovery.getServices()).willReturn(Collections.singletonList(MYSERVICE)); + given(this.discovery.getLocalServiceInstance()).willReturn(new DefaultServiceInstance(MYSERVICE, "localhost", 80, false)); + + ProxyRouteLocator routeLocator = new ProxyRouteLocator("/", this.discovery, + this.properties); + + LinkedHashMap routes = routeLocator.locateRoutes(); + ZuulRoute actual = routes.get("/**"); + assertNull("routes didn't ignore "+MYSERVICE, actual); + + Map routesMap = routeLocator.getRoutes(); + assertNotNull("routesMap was null", routesMap); + assertTrue("routesMap was empty", routesMap.isEmpty()); + } + + @Test + public void testIgnoredLocalServiceFalse() { + this.properties.setIgnoreLocalService(false); + + given(this.discovery.getServices()).willReturn(Collections.singletonList(MYSERVICE)); + + ProxyRouteLocator routeLocator = new ProxyRouteLocator("/", this.discovery, + this.properties); + + Map routesMap = routeLocator.getRoutes(); + assertNotNull("routesMap was null", routesMap); + assertFalse("routesMap was empty", routesMap.isEmpty()); + assertMapping(routesMap, MYSERVICE); + } + + protected void assertMapping(Map routesMap, String serviceId) { assertMapping(routesMap, serviceId, serviceId); }