2017-01-26 7 views
7

私はいくつかのマイクロサービスをユーレカで発見しました。それらのほとんどはAPIを提供しています。 そして私は実際にZuulプロキシである "ゲートウェイサービス"と呼ばれる "エッジ"サービスを持っています。 問題は、Webアプリケーションがあることです。それは長い間ゲートウェイサービスによってホストされていたし、それに問題はなかった。 今はゲートウェイの背後にある別のサービスでこのクライアントをホストする必要があります。 これは問題ではありません。私は新しいサービスを作成し、そこにWebアプリケーションを配置しました。しかし、事は、ゲートウェイサービスのZuulが、私はそう、このhttp://app.com/ようなルートパスから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/api/によってのみそれにアクセスすることができます。

私の仕事は、次のとおりです。

  1. ルートパスから利用できる他のサービスでホストされているWebアプリケーションを作成します。
  2. 他のすべてのサービスでは/apiという接頭辞が残っていることも非常に重要です。

私はZuulFilterを実装しようとしました。しかし、ルートパスでは何もしないように見え、上記のルートと一致する場合にのみ実行されます。

どうすればこの作品を作成できますか?

更新日ZuulFilterで少し成功しました。私はそれを仕事にしました。

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の構成があります。一致したすべてのパスをZuulフィルタチェーン(described in documentation)にマップすることができます。ここに記載されている他のルートはすべて/apiのように設定されています。このようなサービスに達することができます:http://app.com/requests要求サービスのために。 ZuulFilterは、プロパティに記述されているすべての要求に対してチェックを実行しますが、要求されたURIが/apiで始まり、パスに/apiのようにこの要求を同じ方法でリダイレクトする場合にのみ実行されます。

実際に動作します。しかし、私はまだ/apiプレフィックスなしのエンドポイントがゲートウェイサービスに残っているため、この解決策は嫌です。誰でもそれを改善する方法を知っているかもしれませんか?

答えて

3

私は、次の操作を行います:

  1. zuul.prefixプロパティをドロップします。
  2. 接頭辞の前に 'api to all of your zuul.routes。*。path`プロパティを追加します。
  3. 次のプロパティがあります(リストの最後に)最後のルートを追加します:

app: 
    path: /** 
    stripPrefix: false 

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

+0

ありがとうございました。私が最初に考えていたこの種の解決策。そして、私はこれがうまくいくと確信しています。しかし、私は、各ルートに対して明示的に ''/api''プレフィックスを書くのはちょっと混乱していると思います。ほとんどの場合、私が実際に投稿した設定には50以上のルートが含まれているので、私の状況には十分ではありません:)この細部は私の言葉を忘れていました。しかし、これはいくつかのルートを持つプロキシには十分適しています。 –

+1

あなたは50以上のルートの大部分/すべてを持っているかもしれませんが、正確なルートが各サービスにどのようなものかを明確に示唆しています。また、 '/ api'が前に付いていない他のサービスをサポートするための非常に柔軟なソリューションです。 –

関連する問題