2017-03-03 10 views
1

私はすべてのリクエストをAPIに単一のエンドポイントにいくつかの条件に基づいて転送しようとしています。すべてのZuulプロキシリクエストを単一のURLに動的に再ルーティング

2017-03-03 16:11:30.735 EST 0037 DEBUG     o.s.s.w.u.matcher.AntPathRequestMatcher : Checking match of request : '/outage/alerts/public'; against '/beans/' 

public class OutagePeriodFilter extends ZuulFilter { 

    @Override 
    public String filterType() { 
     return "route"; 
    } 

    @Override 
    public int filterOrder() { 
     return 0; 
    } 

    @Override 
    public boolean shouldFilter() { 
     return isOutagePeriod(); 
    } 

    @Override 
    public Object run() { 
     RequestContext ctx = RequestContext.getCurrentContext(); 
     HttpServletRequest request = ctx.getRequest(); 


     // if outage - redirect everyone to http://localhost:8082/outage 
     try { 
      String url = UriComponentsBuilder.fromHttpUrl("http://localhost:8082").path("/outage").build() 
            .toUriString(); 
      ctx.setRouteHost(new URL(url)); 
     } catch(MalformedURLException mue) { 
      log.error("Cannot forward to outage period website"); 
     } 
     return null; 
    } 


    private boolean isOutagePeriod() { 
     // returns true if outage 
    } 
} 

しかしhttp://localhost:8080/alerts/publicに要求を行った後、私のAPIのログが表示さ:

Gatewayアプリは、私は次のフィルタを作成した8080

ポート上で実行されます何らかの理由で元のPATHをリダイレクトPATHに追加し、その結果、/outage/alerts/public wh ichは存在しません。ちょうど/outageにリクエストしたいと思います。

ctx.setRouteHost()と同じように、フィルタにブレークポイントを設定すると、正しいURL(http://10.50.36.43:8082/outage/)が表示されます。

マイapplication.properties

zuul.routes.api.path=/api/** zuul.routes.api.url=http://localhost:8082/

答えて

4

まず、代わりにROUTE_TYPEの使用PRE_TYPE(通称 "ルート")

@Override 
public String filterType() { 
    return FilterConstants.PRE_TYPE; 
} 

第二には、正しいfilterOrderを指定

@Override 
public int filterOrder() { 
    return FilterConstants.SEND_FORWARD_FILTER_ORDER; 
} 

第三に、 "/ aleを含むURIを削除する必要がありますzuul

@Override 
public Object run() { 

    ctx.set("requestURI", ""); 

    // your code 

    return null; 
} 

によってrouteHostに追加されたRTS /パブリック」、最後に、コード内でオーバーライド転送URL(//あなたのコード)。そして、あなたはzuulは、同じホストへのプロキシ「ではないoutaged」リクエスト

zuul.routes.api.path=/api/** 
zuul.routes.api.url=http://localhost:8080/api 

このような私見に(何のルートが存在しない場合zuulフィルタが動作しない原因となる)少なくとも一つの経路を指定する必要がありますこれを行うには非常に便利な方法ではありません。

関連する問題