锋哥原创的微服务网关Gateway视频教程:

Gateway微服务网关视频教程(无废话版)_哔哩哔哩_bilibiliGateway微服务网关视频教程(无废话版)共计17条视频,包括:1_Gateway简介、2_Gateway工作原理、3_Gateway HelloWorld快速入门等,UP主更多精彩视频,请关注UP账号。两天学会微服务网关Gateway-Gateway网关限流-LMLPHPhttps://www.bilibili.com/video/BV1oX4y1u7ZJ/gateway默认给我们提供了限流实现,也就是网关拦截器RequestRateLimiter。

6.1 令牌桶限流算法

RequestRateLimiter底层实现是令牌桶算法;

令牌桶内存储令牌,令牌桶需要设置令牌容量,也就是系统最大的并发大;

以一定的速率生成令牌(具体速率根据系统性能设置),放到令牌桶,如果桶慢了,则丢弃;

客户端来一个请求,则先去令牌桶获取令牌,拿到令牌,则处理请求,否则 丢弃或者返回失败;

令牌桶算法的优点:

通过恒定的速率生成令牌桶,能够让请求处理更均匀,不会出现短时间大量的请求处理;

比较友好的控制高并发;

两天学会微服务网关Gateway-Gateway网关限流-LMLPHP

6.2 Gateway网关限流实例

Spring Cloud Gateway官方提供了 RequestRateLimiterGatewayFilterFactory 过滤器工厂,使用 RedisLua 脚本实现了令牌桶,来实现网关限流;

添加下Redis依赖:

<!-- spring boot redis 缓存引入 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- lettuce pool 缓存连接池 -->
<dependency>
	<groupId>org.apache.commons</groupId>
	<artifactId>commons-pool2</artifactId>
</dependency>
URI限流

配置类:

package com.java1234.config;

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;

/**
 * 限流规则配置类
 * @author java1234_小锋
 * @site www.java1234.com
 * @company Java知识分享网
 * @create 2021-01-23 11:16
 */
@Configuration
public class keyResolverConfiguration {

    @Bean
    public KeyResolver pathKeyResolver(){

        /*return new KeyResolver() {
            @Override
            public Mono<String> resolve(ServerWebExchange exchange) {
                return Mono.just(exchange.getRequest().getURI().getPath());
            }
        };*/


        return exchange -> Mono.just(exchange.getRequest().getURI().getPath());  // URI限流
    }
}

yml配置:

spring:
  application:
    name: gateway-server
  cloud:
    gateway:
      routes:
        - id: rateLimiter
          uri: http://localhost:8080/
          predicates:
           - Path=/product/**
          filters:
           - name: RequestRateLimiter  # 限流过滤器
             args:
               redis-rate-limiter.replenishRate: 1   # 令牌桶每秒填充速率
               redis-rate-limiter.burstCapacity: 2   # 令牌桶总容量
               redis-rate-limiter.requestedTokens: 1  # 一个请求需要消费的令牌数
               key-resolver: "#{@pathKeyResolver}"
  redis:  # redis配置
    host: 192.168.0.103 # IP
    port: 6379  # 端口
    password:  # 密码
    connect-timeout: 10s  # 连接超时时间
    lettuce: # lettuce redis客户端配置
      pool:  # 连接池配置
        max-active: 8  # 连接池最大连接数(使用负值表示没有限制) 默认 8
        max-wait: 200s  # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
        max-idle: 8 # 连接池中的最大空闲连接 默认 8
        min-idle: 0 # 连接池中的最小空闲连接 默认 0

访问过多之后,报429错误;

两天学会微服务网关Gateway-Gateway网关限流-LMLPHP

03-07 06:37