Spring cloud网关多维度限流

网关多维度限流

参考使用spring-cloud-zuul-ratelimit

  • 对请求的目标URL进行限流(例如:某个URL每分钟只允许调用多少次)
  • 对客户端的访问IP进行限流(例如:某个IP每分钟只允许请求多少次)
  • 对某些特定用户或者用户组进行限流(例如:非VIP用户限制每分钟只允许调用100次某个API等)
  • 多维度混合的限流。此时,就需要实现一些限流规则的编排机制。与、或、非等关系。

介绍

spring-cloud-zuul-ratelimit是和zuul整合提供分布式限流策略的扩展,只需在yaml中配置几行配置,就可使应用支持限流

<dependency>
            <groupId>com.marcosbarbero.cloud</groupId>
            <artifactId>spring-cloud-zuul-ratelimit</artifactId>
            <version>2.2.3.RELEASE</version>
        </dependency>
		

支持的限流粒度

  • 服务粒度 (默认配置,当前服务模块的限流控制)

  • 用户粒度 (详细说明,见文末总结)

  • ORIGIN粒度 (用户请求的origin作为粒度控制)

  • 接口粒度 (请求接口的地址作为粒度控制)

  • 以上粒度自由组合,又可以支持多种情况。

  • 如果还不够,自定义RateLimitKeyGenerator实现。

//默认实现
public String key(final HttpServletRequest request, final Route route, final RateLimitProperties.Policy policy) {
    final List<Type> types = policy.getType();
    final StringJoiner joiner = new StringJoiner(":");
    joiner.add(properties.getKeyPrefix());
    if (route != null) {
        joiner.add(route.getId());
    }
    if (!types.isEmpty()) {
        if (types.contains(Type.URL) && route != null) {
            joiner.add(route.getPath());
        }
        if (types.contains(Type.ORIGIN)) {
            joiner.add(getRemoteAddr(request));
        }
        // 这个结合文末总结。
        if (types.contains(Type.USER)) {
            joiner.add(request.getUserPrincipal() != null ? request.getUserPrincipal().getName() : ANONYMOUS_USER);
        }
    }
    return joiner.toString();
}

支持的存储方式

  • InMemoryRateLimiter - 使用 ConcurrentHashMap作为数据存储
  • ConsulRateLimiter - 使用 Consul 作为数据存储
  • RedisRateLimiter - 使用 Redis 作为数据存储
  • SpringDataRateLimiter - 使用 数据库 作为数据存储

限流配置

  • limit 单位时间内允许访问的个数
  • quota 单位时间内允许访问的总时间(统计每次请求的时间综合)
  • refresh-interval 单位时间设置
  • type : url ,httpmethod, user,origin
zuul:
  ratelimit:
    enabled: true
    repository: REDIS
    policy-list:
      user:
        - limit: 10
          refresh-interval: 60
          type:
            - origin
      auth:
        - limit: 2
          refresh-interval: 2
          type:
            - origin
      file:
        - limit: 2
                            #允许多少个访问
          refresh-interval: 60
        #多少秒内
          type:
            - url
      log:
        - quota: 1
                         #总请求实际
          refresh-interval: 60
         #多少秒内
          type:
            - origin   
    

效果展示

发布了11 篇原创文章 · 获赞 0 · 访问量 162

猜你喜欢

转载自blog.csdn.net/sdjxgd/article/details/105201057