0

对 /app/login 的 POST 请求应该重定向到http://abc:100/app/login,对 /app/login 的 DELETE 请求应该重定向到http://xyz:200/app/login。这如何在 Netflix Zuul 路由配置中实现?是否有选项可以在路由配置中提及 http 方法?

这是解释我们的场景的条目。

zuul:
  routes:
    Login:
      path: /app/login
      url: http://abc:100/app/login


    Logout:
      path: /app/login
      url: http://xyz:200/app/login
4

1 回答 1

2

更新: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 方法不匹配。

于 2015-12-01T22:58:23.527 回答