更新:spring-cloud-netflix 不会通过简单的配置开箱即用地执行此操作,但实际上添加自定义 ZuulFilter 来满足您的需要很容易。请参阅如何在 Spring Cloud 中创建自定义 Zuul 过滤器?
我认为这样的事情应该适合你:
@Component
public class MyCustomZuulFilter extends ZuulFilter {
private urlPathHelper = new UrlPathHelper();
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
final String requestURI =
this.urlPathHelper.getPathWithinApplication(ctx.getRequest());
if ("/app/login".equals(requestURI)
&& ctx.getRequest() != null
&& !StringUtils.isBlank(ctx.getRequest().getMethod())) {
if ("DELETE".equals(ctx.getRequest().getMethod().toUpperCase())) {
ctx.set("serviceId", "XYZ-SVC");
ctx.setRouteHost(null);
ctx.addOriginResponseHeader("X-Zuul-ServiceId", location);
} else if ("POST".equals(ctx.getRequest().getMethod().toUpperCase())) {
ctx.set("serviceId", "ABC-SVC");
ctx.setRouteHost(null);
ctx.addOriginResponseHeader("X-Zuul-ServiceId", location);
}
}
return null;
}
}
请注意,根据您的设置,您可能仍需要将 /app/login 映射到现有服务的 Zuul 规则,因为捆绑的PreDecorationFilter 会自动将无法识别的路由设置为“forward.to”。
我有完全相同的用例,但 Zuul 目前似乎无法基于 HTTP 方法进行路由。
有问题的代码在ProxyRouteLocator#getMatchingRoute方法中。它遍历定义的 ZuulRoute 条目以查找匹配的路由。不幸的是,#getMatchingRoute 中的逻辑和 ZuulRoute 的属性似乎与 HTTP 方法不匹配。