2017-03-03 94 views
1

我試圖根據某些條件將所有請求轉發到我的API到單個端點。將所有Zuul代理請求動態重新路由到單個URL

Gateway應用程序運行在8080

我創建了以下過濾器端口:

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日誌顯示:

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/' 

對於某些原因,它將原始路徑附加到重定向路徑,導致請求/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

首先,使用PRE_TYPE代替ROUTE_TYPE(又名 「路線」)

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

二,指定了正確的filterOrder

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

三,你需要刪除包含「/ ale」的URI rts/public「,它被追加到zuul的routeHost

@Override 
public Object run() { 

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

    // your code 

    return null; 
} 

最後,在代碼中覆蓋轉發網址(//您的代碼)。而且你必須指定代理「不outaged」請求到同一臺主機這樣

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

恕我直言,至少一條路徑(因爲如果沒有路線zuul過濾器不工作),zuul是這不是一個非常方便的方法。