DiscoveryClient ルート定義ロケーター

DiscoveryClient 互換のサービスレジストリに登録されているサービスに基づいてルートを作成するようにゲートウェイを設定できます。

デフォルトでは、作成されたルートはプロトコル lb://service-name (service-name は DiscoveryClient::getServices が返す文字列) を使用し、これは負荷分散されることを意味します。そのため、クラスパスで使用できるように、org.springframework.cloud:spring-cloud-starter-loadbalancer 依存関係も含める必要があります。

これを有効にするには、spring.cloud.gateway.discovery.locator.enabled=true を設定し、DiscoveryClient 実装 (Netflix Eureka、Consul、Zookeeper、Kubernetes など) がクラスパス上にあり、有効になっていることを確認します。

DiscoveryClient ルートの述語とフィルターの構成

デフォルトでは、ゲートウェイは DiscoveryClient で作成されたルートに対して単一の述語とフィルターを定義します。

デフォルトの述語は、パターン /serviceId/** で定義されたパス述語です。ここで、serviceId は、DiscoveryClient からのサービスの ID です。

デフォルトのフィルターは、正規表現 /serviceId/?(?<remaining>.*) と置換 /${remaining} を使用した書き換えパスフィルターです。これにより、リクエストがダウンストリームに送信される前に、パスからサービス ID が削除されます。

DiscoveryClient ルートで使用される述語またはフィルターをカスタマイズする場合は、spring.cloud.gateway.discovery.locator.predicates[x] と spring.cloud.gateway.discovery.locator.filters[y] を設定します。その際、その機能を保持する場合は、前述のデフォルトの述語とフィルターを必ず含める必要があります。次の例は、プロパティと yaml 形式でこれがどのように見えるかを示しています。

spring.cloud.gateway.discovery.locator.predicates[0].name=Path
spring.cloud.gateway.discovery.locator.predicates[0].args[pattern]="'/'+serviceId+'/**'"
spring.cloud.gateway.discovery.locator.predicates[1].name=Host
spring.cloud.gateway.discovery.locator.predicates[1].args[pattern]="'**.foo.com'"
spring.cloud.gateway.discovery.locator.filters[0].name=CircuitBreaker
spring.cloud.gateway.discovery.locator.filters[0].args[name]=serviceId
spring.cloud.gateway.discovery.locator.filters[1].name=RewritePath
spring.cloud.gateway.discovery.locator.filters[1].args[regexp]="'/' + serviceId + '/?(?<remaining>.*)'"
spring.cloud.gateway.discovery.locator.filters[1].args[replacement]="'/$\{remaining}'"
例 2: application.yml
spring:
  cloud:
    gateway:
      discovery:
        locator:
          predicates:
          - name: Host
            args:
              pattern: "'**.foo.com'"
          - name: Path
            args:
              pattern: "'/'+serviceId+'/**'"
          filters:
          - name: CircuitBreaker
            args:
              name: serviceId
          - name: RewritePath
            args:
              regexp: "'/' + serviceId + '/?(?<remaining>.*)'"
              replacement: "'/${remaining}'"