[Soul 源码之旅] 1.8.5 Soul插件初体验 (RateLimiter)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Soul 源码之旅] 1.8.5 Soul插件初体验 (RateLimiter)相关的知识,希望对你有一定的参考价值。
参考技术A 按照惯用套路我们先观察一下 RateLimiterPluginConfiguration 做了什么:这里初始化了 RateLimiterPlugin 和 RateLimiterPluginDataHandler ,前者是标准的 soulPlugin ,而后者是插件配置数据处理器,用于监听数据变化,并更新策略。我们来先看一下 RateLimiterPlugin ,我们以前讲过,AbstractSoulPlugin 有个 default 的 excute , 用于匹配 Selector 和 Rule ,比配成功就会调用 plugin 实现的 doExecute 方法。我们看一下 doExcute 方法它主要通过 redisRateLimiter 的 isAllowed 方法根据 rule 的 id capacity 和 rate 检测是否可以通过检查。假如检查不通过,则直接返回错误。我们再看一下 isAllowed 方法:
我们前面说过 Soul 的限流是通过 redis 通过管理令牌,他是通过 一个 lua 脚本实现的,这里 isAllowed 方法主要是调用 redis lua 脚本,然后看返回结果,然后根据结果构造返回值。我们重点来看一下这个 lua 脚本。它位于 /META-INF/scripts/request_rate_limiter.lua 这个路径。
我们可以根据上面的注解了解具体 lua 脚本是如何判断的,这里最重要的是一个概念周期,一个周期等于总的容量除以速率。
在压测的时候我们可以查看一下 redis 中存储的值以方便理解,如下:
soul 中通过 redis 执行 lua 脚本实现了令牌桶协议,这同时也可以应用到我们项目中 不仅是限流的场景,也可以使用在 分布式锁 的场景中。
Android探索之旅(第三十篇)寻找那些有趣的AndroidStudio插件
Resource-Usage-Count资源文件引用计数插件
一个帮你快速调试UI参数的Android插件
以上是关于[Soul 源码之旅] 1.8.5 Soul插件初体验 (RateLimiter)的主要内容,如果未能解决你的问题,请参考以下文章