咱們在開發系統的時候可能會對系統進行限流的需求, springcloudGateway有自帶限流的方案,在此以前能夠先去學習一下springcloud gateway中的filter。
springcloud Gateway中提供了一個RequestRateLimiterGatewayFilterFactory。
這種限流方式用到了redis, 先添加redis的依賴。redis
配置類以下:算法
public class RemoteAddrKeyResolver implements KeyResolver { public static final String BEAN_NAME = "remoteAddrKeyResolver"; @Override public Mono<String> resolve(ServerWebExchange exchange) { System.out.println("hello"); Mono<String> just = Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()); return just; } }
@Configuration public class RemoteKeyResolver { @Bean(name="remoteAddrKeyResolver") public RemoteAddrKeyResolver remoteAddrKeyResolver() { return new RemoteAddrKeyResolver(); } }
在此咱們是根據ip地址限流的, Mono<String> just = Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress())spring
application.yml配置文件配置以下:api
spring: application: name: gateway-service # redis: # database: 0 # host: localhost # port: 6379 # password: # timeout: 1000ms # lettuce: # pool: # max-active: 8 # max-idle: 8 # min-idle: 1 # max-wait: 1000ms # cache: # type: REDIS cloud: gateway: discovery: locator: enabled: true routes: - id: order uri: lb://order-service predicates: - Path=/api/order-service/** filters: - StripPrefix=1 - name: RequestRateLimiter args: key-resolver: '#{@remoteAddrKeyResolver}' redis-rate-limiter.replenishRate: 1 redis-rate-limiter.burstCapacity: 2
上面貼出的是完整的springcloud Gateway的配置, 主要配置爲filters下的-RequestRateLimiter,
key-resolver表示使用名爲remoteAddKeyResolver的限流配置配置類,此限流方式採用的是令牌桶算法的限流方式
redis-rate-limiter.repleushRate :令牌桶每秒填充平均速率。
redis-rate-limiter.burstCapacity: 令牌桶的總容量app