基于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上部分的代码。