资讯专栏INFORMATION COLUMN

Zuul:构建高可用网关之多维度限流

wenshi11019 / 3120人阅读

摘要:对请求的目标进行限流例如某个每分钟只允许调用多少次对客户端的访问进行限流例如某个每分钟只允许请求多少次对某些特定用户或者用户组进行限流例如非用户限制每分钟只允许调用次某个等多维度混合的限流。

对请求的目标URL进行限流(例如:某个URL每分钟只允许调用多少次)

对客户端的访问IP进行限流(例如:某个IP每分钟只允许请求多少次)

对某些特定用户或者用户组进行限流(例如:非VIP用户限制每分钟只允许调用100次某个API等)

多维度混合的限流。此时,就需要实现一些限流规则的编排机制。与、或、非等关系。

介绍

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


    com.marcosbarbero.cloud
    spring-cloud-zuul-ratelimit
    1.3.4.RELEASE
支持的限流粒度

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

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

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

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

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

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

//默认实现
public String key(final HttpServletRequest request, final Route route, final RateLimitProperties.Policy policy) {
    final List 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 单位时间设置

zuul:
  ratelimit:
    key-prefix: your-prefix 
    enabled: true 
    repository: REDIS 
    behind-proxy: true
    policies:
      myServiceId:
        limit: 10
        quota: 20
        refresh-interval: 30
        type:
          - user
        

以上配置意思是:30秒内允许10个访问,并且要求总请求时间小于20秒

效果展示

yaml配置:

zuul:
  ratelimit:
    key-prefix: pig-ratelimite 
    enabled: true 
    repository: REDIS 
    behind-proxy: true
    policies:
      pig-admin-service:
        limit: 2
        quota: 1
        refresh-interval: 3

动态图 ↓↓↓↓↓

Redis 中数据结构 注意红色字体

总结

可以使用Spring Boot Actuator 提供的服务状态,动态设置限流开关

源码可以参考:https://gitee.com/log4j/pig

用户限流的实现:如果你的项目整合 Shiro 或者 Spring Security 安全框架,那么会自动维护request域UserPrincipal,如果是自己的框架,请登录成功后维护request域UserPrincipal,才能使用用户粒度的限流。未登录默认是:anonymous

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70685.html

相关文章

  • 微服务网关方案调研

    摘要:综述经调研,使用解决方案的占多数,已经能满足绝大多数公司需求。但除了一些超级公司外,比如阿里,京东,他们是自己撸的一套网关。 综述 经调研,使用Spring Cloud Zuul解决方案的占多数,已经能满足绝大多数公司需求。但除了一些超级公司外,比如阿里,京东,他们是自己撸的一套网关。此外,点评直接采用的nginx负载均衡前置网关,而没用第七层网关,原因据说是七层网关会影响性能,但由于...

    Y3G 评论0 收藏0
  • 墙裂推荐:搜云库技术团队,面试必备的技术干货

    摘要:今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 面试必备 面试必备:深入Spring MVC DispatchServlet 源码...

    SegmentFault 评论0 收藏0
  • 墙裂推荐:搜云库技术团队,面试必备的技术干货

    摘要:今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 面试必备 面试必备:深入Spring MVC DispatchServlet 源码...

    Neilyo 评论0 收藏0
  • Spring Cloud - 技术栈

    摘要:整理自杨波老师的总结注册中心支持模型存储和灵活健康检查能力。服务网关选择是最佳搭配,但异步性能不足基于的异步未推出正式版。配置中心缺失治理能力。监控存储依赖于时间序列数据库。队列对于日志等可靠性要求不高的场景,用。功能强大但复杂。 整理自杨波老师的总结 showImg(https://segmentfault.com/img/bV3iL1?w=800&h=512); 注册中心 Eur...

    张金宝 评论0 收藏0
  • spring cloud gateway 限流

    摘要:常见的限流方式,比如适用线程池隔离,超过线程池的负载,走熔断的逻辑。在令牌桶算法中,存在一个桶,用来存放固定数量的令牌。,令牌桶每秒填充平均速率。 转载请标明出处: https://www.fangzhipeng.com本文出自方志朋的博客 在高并发的系统中,往往需要在系统中做限流,一方面是为了防止大量的请求使服务器过载,导致服务不可用,另一方面是为了防止网络攻击。 常见的限流方式,...

    joy968 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<