guopengfeiheze 2020-07-14 11:56 采纳率: 42.9%
浏览 392
已采纳

Spring cloud gateway中限流时如何针对不同的路由设置不同的限流方案

官方文档上支持根据ip、用户、rul限流,但是在官方提供的配置方案中,不同的路由规则只能配置相同的限流方案,比如,要么都是ip限流,要么都是用户限流(在程序中无法初始化多个相同的限流bean,如下代码,一个类中只能有一个KeyResolver的bean)

@Configuration
public class RedisRateLimiterConfig
{
    /**
     * 针对ip限流
     * 
     * @return
     */
    @Bean
    public KeyResolver ipKeyResolver()
    {
        return exchange -> Mono.just(exchange.getRequest().getHeaders().getFirst("X-Forwarded-For"));
    }

    /**
     * 按照Path限流
     *
     * @return key
     */
    // @Bean
    // public KeyResolver pathKeyResolver()
    // {
    // return exchange -> Mono.just(exchange.getRequest().getPath().toString());
    // }

    /**
     * 针对用户限流
     *
     * @return
     */
    // @Bean
    // public KeyResolver userKeyResolver()
    // {
    // return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
    // }

}

配置文件如下:

routes:
      # 路由标识(id:标识,具有唯一性)   限流
      - id: route_requestRateLimiter
        # 目标服务地址(uri:地址,请求转发后的地址)
        uri: lb://bobfintech-userservice
        # 路由条件(predicates:断言,匹配 HTTP 请求内容)
        predicates:
        ## 匹配 GET 请求
        - Method=GET
        # 过滤器(filters:过滤器,过滤规则)
        filters:
        ## 添加指定参数
        - AddRequestParameter=age, three
        ## 限流
        - name: RequestRateLimiter   #name必须为这个Filter
          args:
            ### 限流过滤器的 Bean 名称,使用SpEL表达式从Spring容器中获取Bean对象
            key-resolver: '#{@ipKeyResolver}'
            ### 希望允许用户每秒处理多少个请求,也就是令牌桶每秒填充平均速率
            redis-rate-limiter.replenishRate: 1
            ### 用户允许在一秒钟内完成的最大请求数,令牌桶的上限
            redis-rate-limiter.burstCapacity: 3

那么问题来了,在实际的企业开发中,不可能所有的路由都只用一种限流方式,那么,该如何配置,才能实现不同的路由使用不同的限流方案呢?

  • 写回答

2条回答 默认 最新

  • dabocaiqq 2020-07-14 14:18
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已采纳回答 10月27日

悬赏问题

  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来