SpringCloud之gateway使用、网关限流使用

SpringCloud之gateway使用、网关限流使用
最新回答
我是一只小鸭子

2024-04-27 02:33:07

SpringCloud之Gateway使用与网关限流使用一、微服务网关Gateway

1. 微服务网关技术栈

  • Nginx:Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
  • Zuul:Zuul 是 Netflix 出品的一个基于 JVM 路由和服务端的负载均衡器。
  • Spring Cloud Gateway:Spring Cloud Gateway 是 Spring 出品的基于 Spring 的网关项目,集成断路器、路径重写等功能,性能比 Zuul 好。

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 的配置。修改后最终配置如下:

解释:

  • burstCapacity:令牌桶总容量。
  • replenishRate:令牌桶每秒填充平均速率。
  • key-resolver:用于限流的键的解析器的 Bean 对象的名字。它使用 SpEL 表达式根据 #{@beanName} 从 Spring 容器中获取 Bean 对象。

通过在 replenishRate 和 burstCapacity 中设置相同的值来实现稳定的速率。设置 burstCapacity 高于 replenishRate 时,可以允许临时突发。在这种情况下,需要在突发之间允许速率限制器一段时间(根据 replenishRate),因为两次连续突发将导致请求被丢弃(HTTP 429 - Too Many Requests)。

key-resolver: "#{@userKeyResolver}" 用于通过 SpEL 表达式来指定使用哪一个 KeyResolver。

如上配置表示:一秒内,允许一个请求通过,令牌桶的填充速率也是一秒钟添加一个令牌。最大突发状况也只允许一秒内有一次请求,可以根据业务来调整。

(4)测试

启动 Redis -> 启动注册中心 -> 启动商品微服务 -> 启动 Gateway 网关。打开浏览器访问系统请求,快速刷新,当 1 秒内发送多次请求时,就会返回 429 错误。

通过以上步骤,我们成功实现了 Spring Cloud Gateway 的搭建以及基于令牌桶算法的网关限流功能。