摘要:对请求的目标进行限流例如某个每分钟只允许调用多少次对客户端的访问进行限流例如某个每分钟只允许请求多少次对某些特定用户或者用户组进行限流例如非用户限制每分钟只允许调用次某个等多维度混合的限流。
对请求的目标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 MVC DispatchServlet 源码...
摘要:今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 今天整理了一下近大半年以来的一些文章,和我的预期一样,很多文章我都忘记自己曾经写过了,这个记录的过程让我也有了新的理解。希望大家,收藏,点赞,加转发。 面试必备 面试必备:深入Spring MVC DispatchServlet 源码...
摘要:整理自杨波老师的总结注册中心支持模型存储和灵活健康检查能力。服务网关选择是最佳搭配,但异步性能不足基于的异步未推出正式版。配置中心缺失治理能力。监控存储依赖于时间序列数据库。队列对于日志等可靠性要求不高的场景,用。功能强大但复杂。 整理自杨波老师的总结 showImg(https://segmentfault.com/img/bV3iL1?w=800&h=512); 注册中心 Eur...
摘要:常见的限流方式,比如适用线程池隔离,超过线程池的负载,走熔断的逻辑。在令牌桶算法中,存在一个桶,用来存放固定数量的令牌。,令牌桶每秒填充平均速率。 转载请标明出处: https://www.fangzhipeng.com本文出自方志朋的博客 在高并发的系统中,往往需要在系统中做限流,一方面是为了防止大量的请求使服务器过载,导致服务不可用,另一方面是为了防止网络攻击。 常见的限流方式,...
阅读 3225·2023-04-25 22:47
阅读 3738·2021-10-11 10:59
阅读 2278·2021-09-07 10:12
阅读 4226·2021-08-11 11:15
阅读 3413·2019-08-30 13:15
阅读 1724·2019-08-30 13:00
阅读 937·2019-08-29 14:02
阅读 1640·2019-08-26 13:57