前言:
已经通过案例实现了通过 Spring Cloud Gateway 网关调用服务 API,并已经了解了 Gateway 网关的几个核心概念: routes
, predicates
, filters
。
这几个核心概念串起来就是 Gateway 的执行流程:客户端发请求,通过断言 predicates
进行匹配,若匹配上了则请求就会被发送到网关处理程序,并执行特定的请求过滤器链 fliters
。
Spring Cloud Gateway提供了多种断言 predicate
工厂和过滤器 filter
工厂,也可以自定义断言工厂和过滤器工厂。
本文将使用以下两种方式实现网关的限流:
RequestRateLimiter
过滤器工厂基于 Redis
的限流,RequestRateLimiter
GatewayFilter
工厂使用实现 RateLimiter 的限流器来确定当前请求是否被限流。如果被限流了,则默认返回 HTTP 429 - Too Many Requests
状态。
RequestRateLimiter
网关过滤器工厂采用可选的 keyResolver
参数和特定于速率限制器的参数。
KeyResolver在源码中的定义:
public interface KeyResolver { Monoresolve(ServerWebExchange exchange); } 复制代码
我们可以通过 KeyResolver 来指定限流的 key
,比如可以根据用户做限流,也可以根据 IP 来做限流,或者根据接口进行限流。
目前限流器的实现提供了基于 Redis 的实现,其使用的算法是 令牌桶算法 。
基于 Redis 的限流,需要引入 spring-boot-starter-data-redis-reactive
依赖:
复制代码 org.springframework.boot spring-boot-starter-data-redis-reactive
要实现限流,需要配置 Redis 连接以及在配置网关路由的时候添加 RequestRateLimiter
过滤器:
spring: redis: host: 192.168.242.112 port: 16397 password: s1lcA6;.7Lx9,x cloud: gateway: routes: - id: order-service uri: lb://order-service filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 redis-rate-limiter.burstCapacity: 20 key-resolver: "#{@userKeyResolver}" 复制代码
这