2016-10-24 6 views
2

実行時にユーレカに登録されたマイクロサービスへのZuulルートを無効にしようとしています(私はスプリングブートを使用しています)。Spring Zuul:サービスへのルートを動的に無効にする

これは例である:

localhost/hello 
localhost/world 

は、これらの二つは登録microservicesあります。私はそれをシャットダウンせずに実行時にそれらのいずれかへのルートを無効にしたいと思います。

これを行う方法はありますか?

はクラウドコンフィグ、ZuulFilterを使用できるカスタムを使用する代わりに、

ナノ

+0

ダイナミックにコードを使用していることを意味します。クラウド設定を使用している場合、zuulプロパティからルーティングを削除し、アクチュエータ経由でリフレッシュしてルーティングを実行することはできません... ... –

答えて

0

多くの努力の結果、私はこの解決策を考え出しました。まず、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の上書き1でそのメソッドを呼び出すことによってdoRefresh()メソッドを公開して。ファイル内のプロパティは、イベントがトリガされた修正された

@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に対処することができました:

は、その後、私は私のカスタム実装で豆RouteLocatorを再定義しました()を使用してイベントからデータを抽出します)。私もZuulPropertiesをAutowiredして以来、私はそれにアクセスできました。右のルールで、私は

zuul.ignoredPatterns 

Zuul

のプロパティがそれに応じてZuulPropertiesでその値を変更する変更されたかどうかを見つけることができます。

0

、ありがとうございました。何かのように(部分的な実装は、概念を示すために):

public class BlackListFilter extends ZuulFilter { 

    @Override 
    public String filterType() { 
     return "pre"; 
    } 
    ... 
    @Override 
    public Object run() { 
     RequestContext ctx = RequestContext.getCurrentContext(); 
     String uri = ctx.getRequest().getRequestURI(); 
     String appId = uri.split("/")[1]; 
     if (blackList.contains(appId)) { 
      ctx.setSendZuulResponse(false); 
      LOG.info("Request '{}' from {}:{} is blocked", 
        uri, ctx.getRequest().getRemoteHost(), ctx.getRequest().getRemotePort()); 
     } 
     return null; 
    } 

} 

blackListは、アプリケーションID(春ブートアプリケーション名)のリストが含まれているいくつかのRESTfulなAPIを介して、たとえば管理しました。

+0

フィルタについても考えましたが、私はZuulのネイティブプロパティを使用しようと思っていました:) – Nano

0

ルーティングルールを追加または削除する場合は、新しいルーティングルールを追加したり、既存のルールを削除したりしない限り、リフレッシュコンテキストが機能するはずです.ZuulPropertiesに新しいBeanを追加してマークする必要があります@RefreshScope、@ Primaryを使用します。

たとえば、refreshEndpoint Beanをオートワイヤーし、リスナーに対してrefreshEndpoint.refresh()を適用できます。

カスタムRouteLocatorをプライマリとしてマークすると、zuulにすでに同じタイプのBeanがプライマリとしてマークされているため、問題が発生します。

関連する問題