更新: 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 メソッドでは一致していないようです。