2017-03-03 4 views
1

Ich versuche, alle Anfragen an meine API an einen einzelnen Endpunkt zu übermitteln, basierend auf einer bestimmten Bedingung.Alle Zuul-Proxyanforderungen dynamisch an eine einzelne URL umleiten

Die Gateway App läuft auf Port 8080

ich folgende Filter erstellt haben:

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 
    } 
} 

jedoch nach einer Anfrage an http://localhost:8080/alerts/public machen meine API-Protokolle zeigen:

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

Für Ein Grund dafür, dass der ursprüngliche PATH an den Weiterleitungs-PATH angehängt wird, was zu einer Anfrage an /outage/alerts/public wh führt Ich existiere nicht. Ich möchte eine Anfrage an nur /outage stellen.

Setzen Sie einen Breakpoint in meinem Filter, wie der ctx.setRouteHost() aufgerufen wird, zeigt die richtige URL (http://10.50.36.43:8082/outage/).

Mein application.properties:

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

Antwort

4

Zuerst Verwendung PRE_TYPE statt route_type (auch bekannt als "route")

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

Zweitens geben korrekte filterOrder

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

Drittens Sie müssen den URI mit "/ ale" entfernen rts/public“, die den routeHost von zuul

@Override 
public Object run() { 

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

    // your code 

    return null; 
} 

Schließlich URL angehängt wird, überschreiben Weiterleitung im Code (// Code). Und Sie mindestens eine Route angeben müssen (Ursache zuul Filter funktionieren nicht, wenn es keine Routen sind) an den Proxy „nicht outaged“ Anfragen an den gleichen Host wie dieses

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

IMHO, zuul ist nicht eine sehr bequeme Möglichkeit, dies zu tun.

Verwandte Themen