将所有 Zuul 代理请求动态重新路由到单个 URL
Dynamically re-route all Zuul proxied requests to single URL
我正在尝试根据某些条件将对我的 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(又名 "route")
@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 过滤器将不起作用)来代理 "not outaged" 请求到同一主机 8080 像这样
zuul.routes.api.path=/api/**
zuul.routes.api.url=http://localhost:8080/api
恕我直言,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(又名 "route")
@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 过滤器将不起作用)来代理 "not outaged" 请求到同一主机 8080 像这样
zuul.routes.api.path=/api/**
zuul.routes.api.url=http://localhost:8080/api
恕我直言,zuul 不是一个很方便的方法。