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}'"
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}'"