9.3 使用 Spring Cloud Gateway 和 Redis 实现请求限流
限流是一种用于控制发送到或从应用程序接收的流量速率的模式,有助于使你的系统更具弹性和健壮性。在 HTTP 交互的上下文中,你可以分别使用客户端和服务器端限流器来应用此模式控制传出或传入的网络流量。
客户端限流器用于限制在给定时间内发送到下游服务的请求数量。当第三方组织(如云提供商)管理和提供下游服务时,这是一种有用的模式。你将希望避免因发送超过订阅允许的请求而产生额外费用。对于按使用付费的服务,这有助于防止意外费用。
如果下游服务属于你的系统,你可能会使用限流器来避免为自己造成 DoS 问题。然而,在这种情况下,舱壁模式(或并发请求限制器)可能更适合,它对允许的并发请求数量设置约束,并将被阻止的请求排队。更好的是自适应舱壁,其并发限制由算法动态更新,以更好地适应云基础设施的弹性。
服务器端限流器用于限制上游服务(或客户端)在给定时间内接收的请求数量。当在 API 网关中实现时,此模式可方便地保护整个系统免受过载或 DoS 攻击。当用户数量增加时,系统应以弹性方式扩展,确保为所有用户提供可接受的服务质量。用户流量的突然增加是预期的,通常最初通过向基础设施添加更多资源或更多应用程序实例来解决。然而,随着时间的推移,它们可能成为问题,甚至导致服务中断。服务器端限流器有助于解决这个问题。
当用户在特定时间窗口内超过允许的请求数量时,所有额外的请求将以 HTTP 429 - Too Many Requests 状态被拒绝。限制根据给定策略应用。例如,你可以按会话、IP 地址、用户或租户限制请求。总体目标是在逆境中保持系统对所有用户可用。这就是弹性的定义。此模式还可方便地根据用户的订阅层级提供服务。例如,你可以为基础版、高级版和企业版用户定义不同的限流。
Resilience4J 支持响应式和非响应式应用程序的客户端限流器和舱壁模式。Spring Cloud Gateway 支持服务器端限流器模式,本节将向你展示如何通过使用 Spring Cloud Gateway 和 Spring Data Redis Reactive 为 Edge Service 使用它。让我们从设置 Redis 容器开始。