如何在 Zuul 中基于 header select 路由
How to select route based on header in Zuul
我在服务 A 和 B 前使用 Netflix Zuul 代理。
如何让 Zuul 代理根据传入请求中的 HTTP header 在到 A 和 B 的路由之间进行选择?
您应该根据您的逻辑创建预过滤器。像这样:
@Component
public class RedirectionFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 2;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();`
String header = request.getHeader("YOUR_HEADER_PARAM");
if ("YOUR_A_LOGIC".equals(header) ) {
ctx.put("serviceId", "serviceA");
//ctx.setRouteHost(new URL("http://Service_A_URL”));
} else { // "YOUR_B_LOGIC"
ctx.put("serviceId", "serviceB");
//ctx.setRouteHost(new URL("http://Service_B_URL”));
}
log.info(String.format("%s request to %s", request.getMethod(),
request.getRequestURL().toString()));
return null;
}
我不能 100% 确定重定向部分,但这是满足您需求的开始。
我添加了第二个重定向选项(注释行),也许这两个选项之一会对您有所帮助。
另见 this example
我在服务 A 和 B 前使用 Netflix Zuul 代理。
如何让 Zuul 代理根据传入请求中的 HTTP header 在到 A 和 B 的路由之间进行选择?
您应该根据您的逻辑创建预过滤器。像这样:
@Component
public class RedirectionFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 2;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();`
String header = request.getHeader("YOUR_HEADER_PARAM");
if ("YOUR_A_LOGIC".equals(header) ) {
ctx.put("serviceId", "serviceA");
//ctx.setRouteHost(new URL("http://Service_A_URL”));
} else { // "YOUR_B_LOGIC"
ctx.put("serviceId", "serviceB");
//ctx.setRouteHost(new URL("http://Service_B_URL”));
}
log.info(String.format("%s request to %s", request.getMethod(),
request.getRequestURL().toString()));
return null;
}
我不能 100% 确定重定向部分,但这是满足您需求的开始。 我添加了第二个重定向选项(注释行),也许这两个选项之一会对您有所帮助。
另见 this example