Retry Filter

Retry 过滤器支持以下参数:

  • retries:应尝试的重试次数。

  • methods:应使用 org.springframework.http.HttpMethod 表示的 HTTP 方法重试。

  • series:应使用 org.springframework.http.HttpStatus.Series 表示的一系列状态码重试。

  • exceptions:应重试的抛出异常列表。

为启用的 Retry 过滤器配置以下默认值:

  • retries: Three times

  • series: 5XX series

  • methods: GET method

  • exceptionsIOExceptionTimeoutExceptionRetryException

以下列表配置一个 Retry 过滤器:

application.yml
spring:
  cloud:
    gateway:
      mvc:
        routes:
        - id: retry_test
          uri: http://localhost:8080/flakey
          predicates:
          - Host=*.retry.com
          filters:
          - name: Retry
            args:
              retries: 3
              series: SERVER_ERROR
              methods: GET,POST
GatewaySampleApplication.java
import static org.springframework.cloud.gateway.server.mvc.filter.RetryFilterFunctions.retry;
import static org.springframework.cloud.gateway.server.mvc.handler.GatewayRouterFunctions.route;
import static org.springframework.cloud.gateway.server.mvc.handler.HandlerFunctions.http;
import static org.springframework.cloud.gateway.server.mvc.predicate.GatewayRequestPredicates.host;

@Configuration
class RouteConfiguration {

    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqHeader() {
		return route("add_request_parameter_route")
			.route(host("*.retry.com"), http("https://example.org"))
				.filter(retry(config -> config.setRetries(3).setSeries(Set.of(HttpStatus.Series.SERVER_ERROR)).setMethods(Set.of(HttpMethod.GET, HttpMethod.POST))))
			.build();
    }
}

在将重试过滤器与带有 forward: 为前缀的 URL 结合使用时,必须小心编写目标端点,以便在发生错误的情况下,它不会执行任何可能导致将响应发送给客户端并提交的操作。例如,如果目标端点是带注释的控制器,那么目标控制器方法不应该返回 ResponseEntity,且具有错误状态代码。相反,它应该抛出 Exception 或发出错误信号(例如,通过 Mono.error(ex) 返回值),重试过滤器可以配置为通过重试来处理该信号。

可以为单个 statusmethod 添加简化的“快捷方式”表示法。

以下两个示例是等效的:

application.yml
spring:
  cloud:
    gateway:
      routes:
      - id: retry_route
        uri: https://example.org
        filters:
        - name: Retry
          args:
            retries: 3
            statuses: INTERNAL_SERVER_ERROR
            methods: GET
      - id: retryshortcut_route
        uri: https://example.org
        filters:
        - Retry=3,INTERNAL_SERVER_ERROR,GET