guopengfeiheze
2020-07-14 11:56
采纳率: 40%
浏览 344

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条)

相关推荐 更多相似问题