网关实现限流

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

网关可以做很多的事情,比如,限流,当我们的系统 被频繁的请求的时候,就有可能 将系统压垮,所以 为了解决这个问题,需要在每一个微服务中做限流操作,但是如果有了网关,那么就可以在网关系统做限流,因为所有的请求都需要先通过网关系统才能路由到微服务中。

令牌桶算法是常见的限流算法之一,我们讲解一下漏桶算法:

1)所有的请求在处理之前都需要拿到一个可用的令牌才会被处理;

2)根据限流大小,设置按照一定的速率往桶里添加令牌;

3)桶设置最大的放置令牌限制,当桶满时、新添加的令牌就被丢弃或者拒绝;

4)请求达到后首先要获取令牌桶中的令牌,拿着令牌才可以进行其他的业务逻辑,处理完业务逻辑之后,将令牌直接删除;

5)令牌桶有最低限额,当桶中的令牌达到最低限额的时候,请求处理完之后将不会删除令牌,以此保证足够的限流

令牌桶算法的实现,有很多技术,Guaua是其中之一,redis客户端也有其实现。

2.5.2 限流案例

spring cloud gateway 默认使用redis的RateLimter限流算法来实现,外面来简要实现一下:

1、引入依赖

首先需要引入redis的依赖:

<!--redis-->

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>

    <version>2.2.1.RELEASE</version>

</dependency>

同时不要忘记Redis配置:

  redis:

    host: 127.0.0.1

    port: 6379

2、定义KeyResolver

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

我们可以根据IP来限流,比如每个IP每秒钟只能请求一次,在GatewayApplication定义key的获取,获取客户端IP,将IP作为key,如下代码:

/***

 * IP限流

 * @return

 */

@Bean(name="ipKeyResolver")

public KeyResolver userKeyResolver() {

    return new KeyResolver() {

        @Override

        public Mono<String> resolve(ServerWebExchange exchange) {

            //获取远程客户端IP

            String hostName = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();

            System.out.println("hostName:"+hostName);

            return Mono.just(hostName);

        }

    };

}

在路由中配置如下:

    gateway:

      #路由配置

      routes:

        #唯一标识符

        - id: hailtaxi-driver

          uri: lb://hailtaxi-driver

          #路由断言

          predicates:

            - Path=/driver/**

            - Cookie=username,itheima

            - Header=token,^(?!\d+$)[\da-zA-Z]+$

            - Method=GET,POST

            - Token=Authorization

          filters:

            - PayMethod=alipay,业务整合

            - name: RequestRateLimiter #请求数限流 名字不能随便写 ,使用默认的facatory

              args:

                key-resolver: "#{@ipKeyResolver}"

                redis-rate-limiter.replenishRate: 1

                redis-rate-limiter.burstCapacity: 1

参数说明:

redis-rate-limiter.replenishRate是您希望允许用户每秒执行多少请求,而不会丢弃任何请求。这是令牌桶填充的速率

redis-rate-limiter.burstCapacity是指令牌桶的容量,允许在一秒钟内完成的最大请求数,将此值设置为零将阻止所有请求。

key-resolver: “#{@ipKeyResolver}” 用于通过SPEL表达式来指定使用哪一个KeyResolver.

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

最后更新于