diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ProxyRouteLocator.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ProxyRouteLocator.java index c75412d7..e77542ef 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ProxyRouteLocator.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ProxyRouteLocator.java @@ -10,11 +10,8 @@ import java.util.concurrent.atomic.AtomicReference; import lombok.AllArgsConstructor; import lombok.Data; import lombok.extern.slf4j.Slf4j; - import org.springframework.cloud.client.discovery.DiscoveryClient; -import org.springframework.cloud.context.environment.EnvironmentChangeEvent; import org.springframework.cloud.netflix.zuul.ZuulProperties.ZuulRoute; -import org.springframework.context.ApplicationListener; import org.springframework.util.AntPathMatcher; import org.springframework.util.PathMatcher; import org.springframework.util.StringUtils; @@ -23,7 +20,7 @@ import org.springframework.util.StringUtils; * @author Spencer Gibb */ @Slf4j -public class ProxyRouteLocator implements ApplicationListener { +public class ProxyRouteLocator { public static final String DEFAULT_ROUTE = "/"; @@ -42,16 +39,6 @@ public class ProxyRouteLocator implements ApplicationListener reset() { + return handlerMapping.reset(); + } + + @RequestMapping(method = RequestMethod.GET) + @ResponseBody + public Map getRoutes() { + return handlerMapping.getRoutes(); + } + + @Override + public String getPath() { + return "/routes"; + } + + @Override + public boolean isSensitive() { + return true; + } + + @Override + public Class> getEndpointType() { + return null; + } + +} diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java index 3792363c..5cc3a23d 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulConfiguration.java @@ -8,6 +8,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.cloud.netflix.zuul.filters.post.SendErrorFilter; import org.springframework.cloud.netflix.zuul.filters.post.SendResponseFilter; import org.springframework.cloud.netflix.zuul.filters.pre.DebugFilter; @@ -50,6 +51,7 @@ public class ZuulConfiguration { } @Bean + @RefreshScope public ZuulHandlerMapping zuulHandlerMapping() { return new ZuulHandlerMapping(routes(), zuulController()); } @@ -67,6 +69,11 @@ public class ZuulConfiguration { } + @Bean + public RoutesEndpoint zuulEndpoint() { + return new RoutesEndpoint(zuulHandlerMapping()); + } + // pre filters @Bean public DebugFilter debugFilter() { diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulHandlerMapping.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulHandlerMapping.java index 29a54368..ec3ecaae 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulHandlerMapping.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/ZuulHandlerMapping.java @@ -1,21 +1,18 @@ package org.springframework.cloud.netflix.zuul; -import java.util.Collection; -import java.util.Map; - import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.actuate.endpoint.Endpoint; -import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint; import org.springframework.cloud.client.discovery.InstanceRegisteredEvent; +import org.springframework.cloud.context.scope.refresh.RefreshScopeRefreshedEvent; +import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.jmx.export.annotation.ManagedAttribute; import org.springframework.jmx.export.annotation.ManagedOperation; import org.springframework.jmx.export.annotation.ManagedResource; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.handler.AbstractUrlHandlerMapping; +import java.util.Collection; +import java.util.Map; + /** * MVC HandlerMapping that maps incoming request paths to remote services. * @@ -24,7 +21,7 @@ import org.springframework.web.servlet.handler.AbstractUrlHandlerMapping; */ @ManagedResource(description = "Can be used to list and reset the reverse proxy routes") public class ZuulHandlerMapping extends AbstractUrlHandlerMapping implements - ApplicationListener, MvcEndpoint { + ApplicationListener { private ProxyRouteLocator routeLocator; @@ -38,8 +35,11 @@ public class ZuulHandlerMapping extends AbstractUrlHandlerMapping implements } @Override - public void onApplicationEvent(InstanceRegisteredEvent event) { - registerHandlers(routeLocator.getRoutePaths()); + public void onApplicationEvent(ApplicationEvent event) { + if (event instanceof InstanceRegisteredEvent + || event instanceof RefreshScopeRefreshedEvent) { + reset(); + } } protected void registerHandlers(Collection routes) { @@ -53,8 +53,6 @@ public class ZuulHandlerMapping extends AbstractUrlHandlerMapping implements } } - @RequestMapping(method = RequestMethod.POST) - @ResponseBody @ManagedOperation public Map reset() { routeLocator.resetRoutes(); @@ -62,26 +60,9 @@ public class ZuulHandlerMapping extends AbstractUrlHandlerMapping implements return getRoutes(); } - @RequestMapping(method = RequestMethod.GET) - @ResponseBody @ManagedAttribute public Map getRoutes() { return routeLocator.getRoutes(); } - @Override - public String getPath() { - return "/routes"; - } - - @Override - public boolean isSensitive() { - return true; - } - - @Override - public Class> getEndpointType() { - return null; - } - } diff --git a/spring-cloud-netflix-sidecar/src/test/resources/application.yml b/spring-cloud-netflix-sidecar/src/test/resources/application.yml index 1c1e6956..11796983 100644 --- a/spring-cloud-netflix-sidecar/src/test/resources/application.yml +++ b/spring-cloud-netflix-sidecar/src/test/resources/application.yml @@ -11,6 +11,9 @@ sidecar: eureka: instance: app-group-name: mysidecargroup + client: + serviceUrl: + defaultZone: http://user:password@localhost:8761/eureka/ endpoints: refresh: