Spring boot Spring Zuul:动态禁用到服务的路由

Spring boot Spring Zuul:动态禁用到服务的路由,spring-boot,java-8,netflix-zuul,netflix-eureka,Spring Boot,Java 8,Netflix Zuul,Netflix Eureka,我正在尝试在运行时禁用Zuul路由到向Eureka注册的微服务(我使用的是spring boot) 这是一个例子: localhost/hello localhost/world 这两个是注册的微服务。我想在运行时禁用其中一个的路由,而不关闭它 有办法做到这一点吗 谢谢, Nano除了使用云配置,还可以使用定制。类似(显示概念的部分实现): 其中黑名单包含应用程序ID列表(Spring Boot应用程序名称),例如通过一些RESTful API进行管理。经过大量努力,我想出了这个解决方案。首先

我正在尝试在运行时禁用Zuul路由到向Eureka注册的微服务(我使用的是spring boot)

这是一个例子:

localhost/hello
localhost/world
这两个是注册的微服务。我想在运行时禁用其中一个的路由,而不关闭它

有办法做到这一点吗

谢谢,


Nano

除了使用云配置,还可以使用定制。类似(显示概念的部分实现):


其中
黑名单
包含应用程序ID列表(Spring Boot应用程序名称),例如通过一些RESTful API进行管理。

经过大量努力,我想出了这个解决方案。首先,我使用Netflix Archaius观看一个属性文件。然后,我接着说:

public class ApplicationRouteLocator extends SimpleRouteLocator implements RefreshableRouteLocator {

public ApplicationRouteLocator(String servletPath, ZuulProperties properties) {
    super(servletPath, properties );
}


@Override
public void refresh() {
   doRefresh();
}
}
通过扩展SimpleRouteLocator并在被重写的接口RefreshableRouteLocator中调用其方法,使doRefresh()方法公开

然后,我用我的自定义实现重新定义了bean RouteLocator:

@Configuration
@EnableConfigurationProperties( { ZuulProperties.class } )
public class ZuulConfig {

public static ApplicationRouteLocator simpleRouteLocator;

@Autowired
private ZuulProperties zuulProperties;

@Autowired
private ServerProperties server;

@Bean
@Primary
public RouteLocator routeLocator() {
    logger.info( "zuulProperties are: {}", zuulProperties );
    simpleRouteLocator = new ApplicationRouteLocator( this.server.getServletPrefix(),
            this.zuulProperties );


    ConfigurationManager.getConfigInstance().addConfigurationListener( configurationListener );

    return simpleRouteLocator;
}


private ConfigurationListener configurationListener =
        new ConfigurationListener() {

            @Override
            public void configurationChanged( ConfigurationEvent ce ) {

                            // zuulProperties.getRoutes() do something
                            // zuulProperties.getIgnoredPatterns() do something
                            simpleRouteLocator.refresh();
                        }



                }

}
每次修改文件中的属性时,都会触发一个事件,ConfigurationEvent能够处理它(getPropertyName()和getPropertyValue()从事件中提取数据)。因为我还自动连接了ZuulProperties,所以我能够访问它。根据正确的规则,我可以找到Zuul的财产

zuul.ignoredPatterns

已修改,相应地更改了其在ZuulProperties中的值。

此处刷新上下文应该可以工作(只要您没有添加新路由规则或删除当前现有路由规则),如果您添加或删除路由规则,则必须为ZuulProperties添加新bean,并用@RefreshScope、@Primary标记它

例如,您可以自动连接RefreshEndpointbean,并在侦听器上应用refreshEndpoint.refresh()


将自定义RouteLocator标记为primary会导致问题,因为zuul已经将同一类型的bean标记为primary

动态的意思是通过代码。。。如果您正在使用cloud config,那么您可以从zuul属性中删除路由,并通过启动器刷新它,那么路由将不会发生。。。对我来说,这听起来是动态的……我也想到了一个过滤器,但我想尝试使用Zuul的本机属性:)无法解析“ServerProperties”中的方法“getServletPrefix”
zuul.ignoredPatterns