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;
    }
}

バンドルされているPreDecorationFilterが認識されないルートを「forward.to」として自動的に設定するため、設定によっては /app/login を既存のサービスにマップする Zuul ルールが必要になる場合があることに注意してください。

私はまったく同じユースケースを持っていますが、Zuul は現時点では HTTP メソッドに基づいてルーティングできないようです。

問題のコードはProxyRouteLocator#getMatchingRouteメソッドにあります。定義された ZuulRoute エントリを繰り返し処理して、一致するルートを見つけます。残念ながら、#getMatchingRoute のロジックと ZuulRoute のプロパティは、HTTP メソッドでは一致していないようです。

于 2015-12-01T22:58:23.527 に答える