原创

SpringCloud Gateway限流配置与使用

1、内置令牌桶 + Redis的方式
pom.xml文件引入jar包:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>

yaml配置文件:

     routes:
      - id: w1
        predicates:
        - Path=/w/**
        uri: lb://MDB2
        
        filters:
        - StripPrefix=1
        - name: RequestRateLimiter
          args:
            key-resolver: '#{@userKeyResolver}'
            redis-rate-limiter.replenishRate: 1
            redis-rate-limiter.burstCapacity: 3

Java开发编码:

public class RateLimitConfig {
    KeyResolver userKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
    }
}

2、整合GoogleGuava的方式
Java新增DefaultRateLimiter类

package com.mashibing.admin;

import java.util.HashMap;
import java.util.Objects;
import javax.validation.constraints.DecimalMin;
import org.springframework.cloud.gateway.filter.ratelimit.AbstractRateLimiter;
import org.springframework.cloud.gateway.support.ConfigurationService;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import com.google.common.util.concurrent.RateLimiter;
import reactor.core.publisher.Mono;

@Component
@Primary
public class DefaultRateLimiter extends AbstractRateLimiter<DefaultRateLimiter.Config> {

    public DefaultRateLimiter() {
    	
        super(Config.class, "default-rate-limit", new ConfigurationService());
    }

	/**
     * 每秒一个请求,每秒发一个令牌
     */
    private final RateLimiter limiter = RateLimiter.create(1);



    @Override
    public Mono<Response> isAllowed(String routeId, String id) {
        Config config = getConfig().get(routeId);
        limiter.setRate(Objects.isNull(config.getPermitsPerSecond()) ? 1 : config.getPermitsPerSecond());

        boolean isAllow = limiter.tryAcquire();

        return Mono.just(new Response(isAllow, new HashMap<>()));
    }

    @Validated
    public static class Config {

        @DecimalMin("0.1")
        private Double permitsPerSecond;


        public Double getPermitsPerSecond() {
            return permitsPerSecond;
        }

        public Config setPermitsPerSecond(Double permitsPerSecond) {
            this.permitsPerSecond = permitsPerSecond;
            return this;
        }
    }	
	
}

yaml配置文件:

      routes:
      - id: w1
        predicates:
        - Path=/w/**
        uri: lb://MDB2
        
        filters:
        - StripPrefix=1
        - name: RequestRateLimiter
          args:
            rate-limiter: "#{@defaultRateLimiter}"
            key-resolver: "#{@userKeyResolver}"
            default-rate-limit.permitsPerSecond: 0.5

本文链接地址:http://www.ysxbohui.com/article/268

正文到此结束