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

标签 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() 时在我的过滤器中放置一个断点显示正确的 URL (http://10.50.36.43:8082/outage/ ).

我的application.properties:

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

最佳答案

首先,使用 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;
}

最后,覆盖代码中的转发 url(//您的代码)。并且您必须指定至少一个路由(因为如果没有路由,zuul 过滤器将不起作用)以将“未中断”请求代理到同一主机8080,就像这样

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

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

关于spring-boot - 将所有 Zuul 代理请求动态重新路由到单个 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42588698/

相关文章:

java - 如何在运行时注册 WebSecurityConfigs?

spring-boot - 如何在 Tomcat 上运行的 Spring Web 应用程序中使用 Spring 的响应式 WebClient

java - Spring Cloud - Zuul 代理正在生成 No 'Access-Control-Allow-Origin' ajax 响应

spring-boot - Spring-Cloud Zuul 在转发的多部分请求文件名中破坏 UTF-8 符号

java - 从 json 响应中解析一个值,其中大部分负载都是冗余的

java - 线程“kafka-生产者-网络-线程”中未捕获的异常 |生产者1

java - Spring Security 跨源

java - Spring Boot微服务Zuul未运行

java - Spring Cloud Netflix Zuul。 SQLSyntaxErrorException : Table 'rate' doesn't exist

apache - 通过 Zuul 和 Apache 访问代理的资源服务器中的远程 IP 地址