web-dev-qa-db-ja.com

ルートパスからのZuulルート

Eurekaでいくつかのマイクロサービスが発見されました。それらのほとんどはいくつかのAPIを提供します。そして、実はズールプロキシである「ゲートウェイサービス」という「エッジ」サービスがあります。問題は、Webアプリケーションがあるということです。長い間ゲートウェイサービスでホストされていたので問題ありませんでした。しかし今、私はこのクライアントをゲートウェイの背後にある別のサービスでホストする必要があります。問題じゃない。新しいサービスを作成し、そこにWebアプリケーションを配置しました。ただし、ゲートウェイサービスのZuulには次の構成があります

zuul:
  ignoredServices: '*'
  prefix: /api
  sensitiveHeaders: Cookie, Set-Cookie
  routes:
    config-service:
      path: /conf/**
      serviceId: config-service
    security-service:
      path: /security/**
      serviceId: security-service
      stripPrefix: false
    request-service:
      path: /requests/**
      stripPrefix: false

ユーザーがこのhttp://app.com/のようなルートパスからWebアプリケーションにアクセスできるようにする必要があります。しかし、今のところ、完全に間違っているhttp://app.com/api/でしかアクセスできません。

私の仕事は:

  1. 別のサービスでホストされているWebアプリをルートパスから利用できるようにします。
  2. 他のすべてのサービスでは、/apiプレフィックスを残すことも非常に重要です。

ZuulFilterを実装しようとしました。ただし、ルートパスには何の影響も与えず、上記のルートと一致する場合にのみ実行されるようです。

どうすればこれを機能させることができますか?

[〜#〜] update [〜#〜]ZuulFilterで少し成功しました。私はそれを機能させました。 Zuulの構成は次のとおりです。

zuul:
  ignoredServices: '*'
  sensitiveHeaders: Cookie, Set-Cookie
  routes:
    api: /api/**
    config-service:
      path: /conf/**
      serviceId: config-service
    security-service:
      path: /security/**
      serviceId: security-service
      stripPrefix: false
    request-service:
      path: /requests/**
      stripPrefix: false
    frontend-Host-service:
      path: /**

そしてZuulFilter自体

@Bean
    public ZuulFilter apiPrefixStrip(RouteLocator routeLocator) {
        return new ZuulFilter() {

            @Override
            public String filterType() {
                return "pre";
            }

            @Override
            public int filterOrder() {
                return 0;
            }

            @Override
            public boolean shouldFilter() {
                RequestContext context = RequestContext.getCurrentContext();
                return context.getRequest().getRequestURI().startsWith("/api");
            }

            @Override
            public Object run() {
                RequestContext context = RequestContext.getCurrentContext();
                String path = context.getRequest().getRequestURI();
                Route route = routeLocator.getMatchingRoute(path.substring(4));
                if (route != null) {
                    context.put("proxy",route.getId());
                    context.put("requestURI", route.getPath());
                    context.set("serviceId", route.getLocation());
                }
                return null;
            }
        };
    }

これがどのように機能するか:実際には何もしないプロパティzuul.routes.api=/api/**があります。一致したすべてのパスをZuulフィルターチェーンにマップすることができます( ドキュメントで説明 )。ここで説明する他のすべてのルートは、/apiがまったくないように設定されています。次のようなサービスにアクセスできます:http://app.com/requests例:リクエストサービス用。 ZuulFilterは、プロパティに記述されているすべてのリクエストに対してチェックを実行しますが、リクエストされたURIが/apiで始まる場合にのみ実行され、パスに/apiがないのと同じ方法でこのリクエストをリダイレクトします。

それは本当に機能します。しかし、/apiプレフィックスのないエンドポイントがまだゲートウェイサービスに残っているため、このソリューションはまだ好きではありません。誰かがそれを改善する方法を知っているかもしれませんか?

8
Valeriy Maslov

私は次のことをします:

  1. zuul.prefixプロパティを削除します。
  2. 'apito all of yourzuul.routes。*。path`プロパティのプレフィックスを付加します。
  3. 次のプロパティを持つ最終ルートを(リストの最後に)追加します。

app:
  path: /**
  stripPrefix: false

(3)ここでのルートの順序が重要であるため、非常に重要です。これは、着信要求がルートが一致するかどうかを評価する順序です。プロパティファイルでは順序が保持されない可能性があるため、yamlでこれを行うことも重要です( documentation による)。

4