ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringCloudGateway之filters限流

2021-12-04 11:00:01  阅读:175  来源: 互联网

标签:return Mono SpringCloudGateway springframework 限流 filters org import


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

标签:return,Mono,SpringCloudGateway,springframework,限流,filters,org,import
来源: https://blog.csdn.net/qq_30818545/article/details/121712483

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有