经过大量的努力,我想到了这个解决方案。首先,我使用Netflix Archaius观看属性文件。然后我进行如下操作:
public class ApplicationRouteLocator extends SimpleRouteLocator implements RefreshableRouteLocator {public ApplicationRouteLocator(String servletPath, ZuulProperties properties) { super(servletPath, properties );}@Overridepublic void refresh() { doRefresh();}}通过扩展SimpleRouteLocator并在接口RefreshableRouteLocator的重写之一中调用doRefresh()方法来使其公开。
然后,使用自定义实现重新定义bean RouteLocator:
@Configuration@EnableConfigurationProperties( { ZuulProperties.class } )public class ZuulConfig {public static ApplicationRouteLocator simpleRouteLocator;@Autowiredprivate ZuulProperties zuulProperties;@Autowiredprivate ServerProperties server;@Bean@Primarypublic 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中的值。



