SpringCloudGateway之filters限流

Java配置类代码

package com.springcloudalibaba.gateway.configurer;

import com.springcloudalibaba.bclass.base.BaseLoginUserInfo;
import com.springcloudalibaba.bclass.enums.SysKeyEnum;
import com.springcloudalibaba.bclass.util.JwtUtil;
import com.springcloudalibaba.bclass.util.StrUtil;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.Objects;

/**
 * @描述: 限流维度配置
 * @作者: lixing
 * @日期 2021/7/17 14:20
 */
@Component
@Configuration
public class RequestRateLimiterConfig {
    /**
     * @描述 获取请求用户ip作为限流key
     * @作者 lixing
     * @日期 2021/7/17 14:21
     * @Param []
     * @return org.springframework.cloud.gateway.filter.ratelimit.KeyResolver
     *
     * 配置方法:参考网关过滤器的 RequestRateLimiter 配置项
     */
    @Bean
    public HostAddressKeyResolver hostAddressKeyResolver() {
        return new HostAddressKeyResolver();
    }

    /**
     * @描述 获取请求用户id作为限流key
     * @作者 lixing
     * @日期 2021/7/17 14:22
     * @Param []
     * @return org.springframework.cloud.gateway.filter.ratelimit.KeyResolver
     *
     * 配置方法:参考网关过滤器的 RequestRateLimiter 配置项
     */
    @Bean
    public UserKeyResolver userKeyResolver() {
        return new UserKeyResolver();
    }

    /**
     * @描述 获取请求地址的URL地址作为限流key
     * @作者 lixing
     * @日期 2021/7/17 14:26
     * @Param [] 
     * @return org.springframework.cloud.gateway.filter.ratelimit.KeyResolver
     *
     * 配置方法:参考网关过滤器的 RequestRateLimiter 配置项
     */
    @Bean
    @Primary
    public UrlKeyResolver urlKeyResolver() {
        return new UrlKeyResolver();
    }
}

/**
 * @描述 基于ip进行限流
 * @作者 lixing
 * @日期 2021/7/18 14:26
 */
class HostAddressKeyResolver implements KeyResolver {
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        return Mono.just(Objects.requireNonNull(exchange.getRequest().getRemoteAddress()).getHostName());
    }
}

/**
 * @描述 基于用户id进行限流
 * @作者 lixing
 * @日期 2021/7/18 14:26
 */
class UserKeyResolver implements KeyResolver {
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        String token = exchange.getRequest().getHeaders().getFirst(SysKeyEnum.TOKEN.getKey());
        if (!StrUtil.isEffective(token)) {
            return Mono.just("default");
        }
        try {
            BaseLoginUserInfo baseLoginUserInfo = JwtUtil.verifyJwtForHs256(token);
            return Mono.just(baseLoginUserInfo.getAccount());
        } catch (Exception e) {
            return Mono.just("default");
        }
    }
}

/**
 * @描述 基于请求URL地址进行限流
 * @作者 lixing
 * @日期 2021/7/18 14:26
 */
class UrlKeyResolver implements KeyResolver {
    @Override
    public Mono<String> resolve(ServerWebExchange exchange) {
        return Mono.just(exchange.getRequest().getPath().value());
    }
}

网关配置

spring:
  # TODO SpringCloud配置
  cloud:
    # TODO 网关配置
    gateway:
      # 路由机制
      discovery:
        locator:
          # true 默认路由机制
          #   开启服务注册和发现功能,服务网关自动根据服务发现为每一个服务创建一个路由,这个路由将以(大写服务名)开头的请求路径转发到对应的服务中
          #   默认网关访问 127.0.0.1:8763/大写服务名/服务上下文/Controller/Method
          # false 关闭默认路由机制,需要手动配置routes,默认通过路由名进行跳转的方式将失效
          enabled: false
          #  将请求路径上的服务名配置为小写
          #  默认网关访问 127.0.0.1:8763/小写写服务名/服务上下文/Controller/Method
          lower-case-service-id: true
      # 路由地址
      routes:
        # TODO 基于 【API-AUTH】 服务的路由配置
        # 直接访问 127.0.0.1:8768/apiAuth/auth/login
        # 网关访问 127.0.0.1:8763/springCloudGateway/gatewayAuth/auth/login
        - id: BFF-API-AUTH-ROUTE
          uri: lb://apiAuth
          predicates:
            - Path=/springCloudGateway/gatewayAuth/**
          filters:
            # 过滤掉第一个路径的值
            - StripPrefix=1
            # 过滤器实现路径重写功能:将 /gatewayAuth/** 重写为 /apiAuth/**
            - RewritePath=/gatewayAuth/(?<segment>.*),/apiAuth/$\{segment}
            # 自定义 [请求ip] 过滤器。*表示允许所有ip请求,其它格式为:127.0.0.1,192.168.0.110
            - MyIp=192.168.0.110,192.168.0.116
            # 自定义 [请求参数] 过滤器。参数1:是否打印请求参数,参数2:是否解密请求参数
            - MyRequestParams=Y,Y
            # 请求限流
            - name: RequestRateLimiter
              args:
                # 自定义限流key|字段解析器
                key-resolver: '#{@urlKeyResolver}'
                # 每秒向令牌桶添加1个令牌
                redis-rate-limiter.replenishRate: 1
                # 令牌桶最多存储10个令牌
                redis-rate-limiter.burstCapacity: 10
上一篇:filters自定义过滤器如何使用(把毫秒转变成年月日)


下一篇:MySQL数据库知识点