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日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。