Retry GatewayFilter ファクトリ

Retry GatewayFilter ファクトリは、以下のパラメーターをサポートします。

  • retries: 試行する必要のある再試行の回数。

  • statusesorg.springframework.http.HttpStatus を使用して表される、再試行する必要のある HTTP ステータスコード。

  • methodsorg.springframework.http.HttpMethod を使用して表される、再試行する必要のある HTTP メソッド。

  • seriesorg.springframework.http.HttpStatus.Series を使用して表される、再試行される一連のステータスコード。

  • exceptions: 再試行する必要があるスローされた例外のリスト。

  • backoff: 再試行用に構成された指数バックオフ。再試行は、firstBackoff * (factor ^ n) のバックオフ間隔の後に実行されます。ここで、n は反復です。maxBackoff が構成されている場合、適用される最大バックオフは maxBackoff に制限されます。basedOnPreviousValue が true の場合、バックオフは prevBackoff * factor を使用して計算されます。

  • jitter: 再試行用に設定されたランダムジッタ。[backoff - backoff*randomFactor, backoff + backoff*randomFactor] 間のバックオフを生成する

  • timeout: 再試行用に設定されたタイムアウト。

有効になっている場合、Retry フィルターには次のデフォルトが構成されています。

  • retries: 3 回

  • series: 5XX シリーズ

  • methods: GET メソッド

  • exceptionsIOException および TimeoutException

  • backoff: 無効

  • jitter: 無効

  • timeout: 無制限

次のリストは、再試行 GatewayFilter を構成します。

application.yml
spring:
  cloud:
    gateway:
      server:
        webflux:
          routes:
          - id: retry_test
            uri: http://localhost:8080/flakey
            predicates:
            - Host=*.retry.com
            filters:
            - name: Retry
              args:
                retries: 3
                statuses: BAD_GATEWAY
                methods: GET,POST
                backoff:
                  firstBackoff: 10ms
                  maxBackoff: 50ms
                  factor: 2
                  basedOnPreviousValue: false
                jitter:
                  randomFactor: 0.5
                timeout: 100ms
forward: プレフィックス付き URL で再試行フィルターを使用する場合は、エラーが発生した場合にクライアントにレスポンスが送信されてコミットされる可能性のある処理を行わないように、ターゲットエンドポイントを慎重に記述する必要があります。例: ターゲットエンドポイントがアノテーション付きコントローラーである場合、ターゲットコントローラーメソッドはエラーステータスコードで ResponseEntity を返さないようにする必要があります。代わりに、Exception をスローするか、エラーを通知する必要があります(たとえば、Mono.error(ex) の戻り値を介して)。これは、再試行によって処理するように再試行フィルターを構成できます。
再試行フィルターを使用すると、その後に続くすべてのフィルターが再試行されます。再試行フィルターの後のフィルターを複数回実行した場合、その結果が期待どおりであることを確認してください。
本文のある HTTP メソッドで再試行フィルターを使用すると、本文がキャッシュされ、ゲートウェイのメモリが制限されます。本文は、ServerWebExchangeUtils.CACHED_REQUEST_BODY_ATTR で定義されたリクエスト属性にキャッシュされます。オブジェクトの型は org.springframework.core.io.buffer.DataBuffer です。

簡略化された「ショートカット」表記は、単一の status および method で追加できます。

次の 2 つの例は同等です。

application.yml
spring:
  cloud:
    gateway:
      server:
        webflux:
          routes:
          - id: retry_route
            uri: https://example.org
            filters:
            - name: Retry
              args:
                retries: 3
                statuses: INTERNAL_SERVER_ERROR
                methods: GET
                backoff:
                  firstBackoff: 10ms
                  maxBackoff: 50ms
                  factor: 2
                  basedOnPreviousValue: false
                jitter:
                  randomFactor: 0.5
                timeout: 100ms

          - id: retryshortcut_route
            uri: https://example.org
            filters:
            - Retry=3,INTERNAL_SERVER_ERROR,GET,10ms,50ms,2,false,0.5,100ms