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

Spring boot 动态地将所有Zuul代理请求重新路由到单个URL,spring-boot,netflix-zuul,Spring Boot,Netflix Zuul,我试图根据某些条件将所有对API的请求转发到单个端点 Gateway应用程序在端口8080 我创建了以下过滤器: public class OutagePeriodFilter extends ZuulFilter { @Override public String filterType() { return "route"; } @Override public int filterOrder() { return 0

我试图根据某些条件将所有对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
my 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/'
出于某种原因,它会将原始路径附加到重定向路径,从而导致对不存在的
/down/alerts/public
的请求。我只想向
/down
发出请求

在调用
ctx.setRouteHost()
的同时在我的筛选器中放置断点,将显示正确的URL(
http://10.50.36.43:8082/outage/

我的
应用程序.properties


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

首先,使用PRE_类型而不是ROUTE_类型(也称为“ROUTE”)

其次,指定正确的过滤器顺序

@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;
}
最后,重写代码中的转发url(//您的代码)。您必须指定至少一个路由(因为如果没有路由,zuul筛选器将不起作用)来代理“未过期”的请求到同一主机8080,如下所示

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

IMHO,zuul不是一个很方便的方法。

你能建议一个方便的方法吗?Pasan Sumanaratne,我没有研究这个问题。但我首先想到的是拦截器,我问过我的同事,他建议我参考SpringCloudGateway。也许会有帮助。
zuul.routes.api.path=/api/**
zuul.routes.api.url=http://localhost:8080/api