9.1.3 通过过滤器处理请求和响应

仅靠路由和断言只能使应用程序充当代理,但正是过滤器使 Spring Cloud Gateway 真正强大。

过滤器可以在将传入请求转发到下游应用之前运行(前置过滤器)。它们可以用于:

  • 操作请求头
  • 应用限流和断路器
  • 为代理请求定义重试和超时
  • 使用 OAuth2 和 OpenID Connect 触发认证流程

其他过滤器可以在从下游应用收到传出响应后、发送回客户端之前应用(后置过滤器)。它们可以用于:

  • 设置安全头
  • 操作响应体以移除敏感信息

Spring Cloud Gateway 捆绑了许多过滤器,你可以使用它们执行不同的操作,包括向请求添加头、配置断路器、保存 Web 会话、在失败时重试请求或激活限流器。

在前一章中,你学习了如何使用重试模式来提高应用程序的弹性。现在你将学习如何将其作为默认过滤器应用于通过网关中定义的所有路由的 GET 请求。

使用重试过滤器

你可以在 src/main/resources 下的 application.yml 文件中定义默认过滤器。Spring Cloud Gateway 提供的过滤器之一是 Retry 过滤器。配置与我们在第 8 章所做的类似。

让我们为所有 GET 请求定义最多三次重试尝试,当错误在 5xx 范围内(SERVER_ERROR)时。当错误在 4xx 范围内时,我们不想重试请求。例如,如果结果是 404 响应,重试请求是没有意义的。我们还可以列出应尝试重试的异常,如 IOException 和 TimeoutException。

到现在为止,你知道不应该一个接一个地持续重试请求。你应该使用退避策略。默认情况下,延迟使用公式 firstBackoff (factor ^ n) 计算。如果将 basedOnPreviousValue 参数设置为 true,公式将变为 prevBackoff factor。

代码清单 9.5 将重试过滤器应用于所有路由

spring:
 cloud:
 gateway:
 default-filters: # 默认过滤器列表
 - name: Retry # 过滤器名称
 args:
 retries: 3 # 最多重试 3 次
 methods: GET # 只重试 GET 请求
 series: SERVER_ERROR # 只在 5XX 错误时重试
 exceptions: # 只在抛出给定异常时重试
 - java.io.IOException
 - java.util.concurrent.TimeoutException
 backoff:
 firstBackoff: 50ms
 maxBackOff: 500ms
 factor: 2
 basedOnPreviousValue: false # 使用 "firstBackoff * (factor ^ n)" 计算延迟

当下游服务暂时不可用时,重试模式很有用。但如果它长时间停机呢?在那种情况下,我们可以停止向它转发请求,直到确定它恢复为止。继续发送请求对调用者和被调用者都没有好处。在那种场景下,断路器模式就派上用场了。这是下一节的主题。

results matching ""

    No results matching ""