2024-04-27 02:33:07
1. 微服务网关技术栈
2. Spring Cloud Gateway 搭建步骤
(1)在 changgou_gateway 工程中,创建 changgou_gateway_system 工程,并配置 pom.xml 文件,添加 Spring Cloud Gateway 相关依赖。

(2)创建包 com.shitou,并创建引导类 GatewayApplication。

(3)在 resources 下创建 application.yml 文件,配置 Gateway 的路由规则等。

1. 限流背景
当系统被频繁的请求时,有可能将系统压垮。为了解决这个问题,需要在每个微服务中做限流操作。但是,如果有了网关,那么就可以在网关系统做限流,因为所有的请求都需要先通过网关系统才能路由到微服务中。
2. 令牌桶算法
令牌桶算法是比较常见的限流算法之一,其描述如下:
3. 网关限流代码实现
需求:每个 IP 地址 1 秒内只能发送 1 次请求,多出来的请求返回 429 错误。
(1)Spring Cloud Gateway 默认使用 Redis 的 RateLimiter 限流算法来实现。因此,需要引入 Redis 的依赖。

(2)定义 KeyResolver。在 GatewayApplication 引导类中添加如下代码,KeyResolver 用于计算某一个类型的限流的 KEY,也就是说,可以通过 KeyResolver 来指定限流的 Key。

(3)修改 application.yml 中配置项,指定限制流量的配置以及 Redis 的配置。修改后最终配置如下:


解释:
通过在 replenishRate 和 burstCapacity 中设置相同的值来实现稳定的速率。设置 burstCapacity 高于 replenishRate 时,可以允许临时突发。在这种情况下,需要在突发之间允许速率限制器一段时间(根据 replenishRate),因为两次连续突发将导致请求被丢弃(HTTP 429 - Too Many Requests)。
key-resolver: "#{@userKeyResolver}" 用于通过 SpEL 表达式来指定使用哪一个 KeyResolver。
如上配置表示:一秒内,允许一个请求通过,令牌桶的填充速率也是一秒钟添加一个令牌。最大突发状况也只允许一秒内有一次请求,可以根据业务来调整。
(4)测试
启动 Redis -> 启动注册中心 -> 启动商品微服务 -> 启动 Gateway 网关。打开浏览器访问系统请求,快速刷新,当 1 秒内发送多次请求时,就会返回 429 错误。
通过以上步骤,我们成功实现了 Spring Cloud Gateway 的搭建以及基于令牌桶算法的网关限流功能。