【SpringCoud GateWay】令牌桶限流

187 阅读1分钟

1. 导入依赖


        <!-- 限流 需要的依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- 基于redis实现限流-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
        </dependency>

2. 配置redis

3. 配置application.yml

spring:
  application:
    name: upen-gateway
#配置springcloudgateway
  cloud:
    gateway:
      routes:
      - id: auth-server  #保证id唯一
#        uri: http://localhost:9001  #路由转发的服务
        uri: lb://demo-auth  #发现注册中心的sever-id来动态设置路由转发的 uri
        predicates:
        - Path=/user/**     #匹配规则 根据访问的路径来确认那些路由需要转发
        filters:
        - name: RequestRateLimiter
          args:
            key-resolver: "#{@pathKeyResolver}"
            redis-rate-limiter.replenishRate: 1 #每秒向令牌桶下发多少个令牌
            redis-rate-limiter.burstCapacity: 3 #令牌桶最大有多少个令牌
  redis:
    host: localhost
    database: 0
    port: 6379

使用令牌桶算法实现限流,redis记录每秒会有多少个令牌下发到令牌桶,而令牌桶会有一个最大容量。每个请求经过网关时需要从令牌桶中获取一个令牌去执行请求,如果令牌桶内无令牌 则该请求为无效请求,将被拦截

4. 配置令牌解析器

@Configuration
public class KeyResolverConfiguration {



    @Bean
    public KeyResolver pathKeyResolver(){
        return new KeyResolver() {
            @Override
            public Mono<String> resolve(ServerWebExchange exchange) {
                //根据路径进行限流
                //还可以根据ip
                //根据参数进行限流
                return Mono.just(exchange.getRequest().getPath().toString());
            }
        };
    }
}