文档章节

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

冷冷gg
 冷冷gg
发布于 2017/12/01 22:03
字数 753
阅读 2066
收藏 0
  • 对请求的目标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>1.3.4.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();
}

支持的存储方式

image

  • 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

动态图 ↓↓↓↓↓
image

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

总结

  • 可以使用Spring Boot Actuator 提供的服务状态,动态设置限流开关
  • 源码可以参考:https://gitee.com/log4j/pig
  • 用户限流的实现:如果你的项目整合 Shiro 或者 Spring Security 安全框架,那么会自动维护request域UserPrincipal,如果是自己的框架,请登录成功后维护request域UserPrincipal,才能使用用户粒度的限流,未登录默认是:anonymous。具体代码实现可以看 DefaultRateLimitKeyGenerator,type为USER的实现

© 著作权归作者所有

共有 人打赏支持
冷冷gg
粉丝 463
博文 115
码字总数 53284
作品 1
潍坊
UI设计师
私信 提问
加载中

评论(6)

s
sadfafsa
������������
a
apk
不明觉厉
冷冷gg
冷冷gg

引用来自“冷冷gg”的评论

������������

引用来自“Ryan-瑞恩”的评论

好牛逼,,,竟然打出来乱码。
😄😄😄😄 涩费 涩费 兄dei
Ryan-瑞恩
Ryan-瑞恩

引用来自“冷冷gg”的评论

������������
好牛逼,,,竟然打出来乱码。
冷冷gg
冷冷gg
������������
如梦技术
如梦技术
😂我最近也在折腾这套玩意~
SpringCloud 微服务 (十二) 服务网关 Zuul 基础

壹 本节记录学习服务网关的基础内容 在没有网关的时候,如果有很多服务:order,product ... 那么客户端会和每个服务一一打交道,这明显不是一个好方式,需要一个服务来充当请求的统一的入口,就是...

___大侠
2018/07/07
0
0
微服务网关Zuul迁移到Spring Cloud Gateway

背景 在之前的文章中,我们介绍过微服务网关Spring Cloud Netflix Zuul,前段时间有两篇文章专门介绍了Spring Cloud的全新项目Spring Cloud Gateway,以及其中的过滤器工厂。本文将会介绍将微...

aoho
2018/09/24
0
0
微服务架构网关接口设计

近年来微服务架构盛行,我司也利用spring cloud实践微服务。使用的也是spring cloud很经典的架构,zuul充当网关路由,configserver作为静态配置中心,feign作为远程调用http client 等,反正...

数齐
2018/01/01
0
0
API Gateway性能比较:NGINX vs. ZUUL vs.Cloud Gateway vs. Linkerd[译]

2018-03-04 15:07 联发科的反思 前几天拜读了 OpsGenie 公司(一家致力于 Dev & Ops 的公司)的资深工程师 Turgay elik 博士写的一篇文章(链接在文末),文中介绍了他们最初也是采用 Nginx ...

sunsky303
2018/05/11
0
0
luxda/zuul-redislimiter-spring-boot

中文 | English zuul-redislimiter-spring-boot 基于Zuul的限流器 快速开始 克隆, 编译,安装 git clone https://github.com/tangaiyun/zuul-redislimiter-spring-boot.gitcd zuulredislimi......

luxda
2018/12/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

富兰克林的人生信条

春节假期期间读了富兰克林自传,这位饱经风霜的老人出身贫寒,只读过两年书,但是通过刻苦自学和不懈奋斗还是取得了令人难以置信的成就,他的一生可以作为我们普通人的励志典范。 富兰克林 ...

春哥大魔王的博客
今天
1
0
不用中间变量交换 a ,b(三种方法)

1、加减法:该方法可以交换整型和浮点型数值的变量,但在处理浮点型的时候有可能出现精度的损失。 a = a + b; b = a - b; a = a - b; 2、异或法:可以完成对整型变量的交换,对于浮点型变量它...

robslove
今天
5
0
一文了解 OutOfMemory 及解决方案

1. Java 堆空间 发生频率 5颗星 造成原因 无法在 Java 堆中分配对象 吞吐量增加 应用程序无意中保存了对象引用,对象无法被 GC 回收 应用程序过度使用 finalizer。finalizer 对象不能被 GC 立...

java菜分享
今天
6
0
高效遍历Java容器

通过本文,你可以更深入的学习 Java 语言中 forEach 语法的知识,以及它和 C 语言形式的 for 循环、 Steam API 的对比。 简介 Java 程序员经常使用容器,比如 ArrayList 和 HashSet。Java 8 ...

微笑向暖wx
今天
7
0
SpringBoot整合Swagger测试api构建

什么是Swagger? Swagger是什么:THE WORLD’S MOST POPULAR API TOOLING 根据官网的介绍: Swagger Inspector:测试API和生成OpenAPI的开发工具。Swagger Inspector的建立是为了解决开发者的...

编程SHA
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部