动态地将所有Zuul代理请求重新路由到单个URL

时间:2017-03-03 21:25:58

标签: spring-boot netflix-zuul

我正在尝试根据某些条件将对API的所有请求转发到单个端点。

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

由于某种原因,它将原始PATH附加到重定向PATH,从而导致对/outage/alerts/public的请求不存在。我想向/outage提出请求。

在调用ctx.setRouteHost()时,在我的过滤器中设置断点会显示正确的网址(http://10.50.36.43:8082/outage/)。

我的application.properties

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

1 个答案:

答案 0 :(得分:6)

首先,使用PRE_TYPE而不是ROUTE_TYPE(又名"路线")

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

其次,指定正确的filterOrder

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

第三,你需要删除包含" / alerts / public"的URI,它由zuul附加到routeHost

@Override
public Object run() {

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

    // your code

    return null;
}

最后,覆盖代码中的转发网址(//您的代码)。并且您必须指定至少一条路线(如果没有路线,则导致zuul过滤器不起作用)以代理"不会中断"请求同一主机 8080 ,如此

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

恕我直言,zuul不是一个非常方便的方法。