基于zuul 的动态限流框架介绍和说明

一、框架说明

  zuul框架这里就不多介绍了,今天介绍一个基于zuul版本的动态限流代码,代码地址https://gitee.com/aiyuntang/zuul-redislimiter-spring-boot

  部署参考markdown文档,代码结构文档都有说明

二、框架介绍  

  框架很简单,1个eureka服务、2个springboot服务、1个网关web、1个网关核心代码库

  下面重点介绍下网关核心代码库zuul-redislimiter-spring-boot-starter工程里面主要的几个类

  1、LimitingPolicyResource类,动态需改限流数据,这里用到了redis的订阅发布机制

  2、ZuulRateLimiterFilter,过滤器执行方法

  3、LimitingPolicyManager,限流数据类,其中100行代码redis获取方式是使用的无密方式,如果你的redis加密了,得使用下面的方式  

 private final JedisPool jedisPool;
jedis = jedisPool.getResource();

  4、ZuulRedisLimiterConfiguration,修改如下

@Bean(initMethod = "init")
@ConditionalOnMissingBean(LimitingPolicyManager.class)
public LimitingPolicyManager limitingPolicyManager() {
	LimitingPolicyManager limitingPolicyManager = new LimitingPolicyManager(zuulRedisLimiterProperties, policyValidator(), jedisPool());
	return limitingPolicyManager;
}  

  5、使用http测试工具postman测试

 

 

 

 

 

 请求7次以后出现Access denied because of exceeding access rate!,代表限流规则变更成功。

  6、隐蔽问题

  LimitingPolicyManager类定义的缓存代码如下

private Cache<String, LimitingPolicy> LimitingPolicyCache =
            Caffeine.newBuilder().maximumSize(10000).expireAfterAccess(1, TimeUnit.SECONDS).build();

  代码默认是HOURS,我修改成了SECONDS。看过expireAfterAccess方法说明,字面意思是在多少时间周期以后缓存失效,如果是一个小时,就是代表最后一次访问1个小时以后失效,由于网关是大并发流量入口,这种情况几乎不会发生。

三、后续

  目前正在做一个网关框架,网关涉及到内容较多限流、动态路由、熔断、降级、鉴权、黑白名单等。

  限流功能准备整合本次框架代码,动态路由功能已经编写完成,如果有兴趣可以关注我后续更新,动态路由发布。也是引用的git上部分的代码。

 

posted @ 2020-06-15 13:56  一日游戏  阅读(298)  评论(0编辑  收藏  举报