[Soul 源码之旅] 1.8.5 Soul插件初体验 (RateLimiter)

[Soul 源码之旅] 1.8.5 Soul插件初体验 (RateLimiter),第1张

按照惯用套路我们先观察一下 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 脚本实现了令牌桶协议,这同时也可以应用到我们项目中 不仅是限流的场景,也可以使用在 分布式锁 的场景中。

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。

经历了阿里巴巴近10年的双十一大促流量的核心场景考验

运行Soul-admin,进入管理界面:系统管理 -->插件管理 -->sentinel ,点击编辑,把它开启

选择器参照divide的匹配方式,让符合条件的http的请求,能被捕获到

以下配置只是为了更容易出现测试效果,生产环境请勿模仿

疑问:官方文档描述中有失败降级uri,但是实际规则中并没有发现相关配置,一会从源码一探究竟

degrade count:熔断阈值

whether to open the degrade (1 or 0):是否开启熔断,1开启 0关闭

degrade type:熔断类型、熔断策略,slow call ratio(秒级RT) 、 exception ratio(异常比例)、 exception number strategy(分钟级异常数)

degrade window size:降级窗口期大小,单位s

control behavior: warm up(预热/冷启动方式,流量缓慢增加)、 constant speed queuing (匀速排队)、 preheating uniformly queued

grade count:限流阈值

whether control behavior is enabled (1 or 0):是否开启限流,1开启 0关闭

grade type:限流阈值类型 ,QPS 、number of concurrent threads(当前线程数)

网关层需要引入依赖即可

触发降级的三个个条件:满足秒级最大并发量,达到异常比例或者异常数。

所以使用wrk压一下,让流量先上到阈值,便于触发

wrk -t4 -c32 -d10s http://localhost:9195/http/test/findByUserId?userId=2

启动测试一下:: http://localhost:9195/http/test/findByUserId?userId=2

熔断的返回值如下:

<pre>{

"code": -103,

"message": "Service invocation exception, or no result is returned!",

"data": null

}</pre>

为了测试效果明显,可以在controller中Thread.sleep(2000),增加延迟效果

分析前理解sentinel中两个重要的概念:资源与规则

https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5

根据数据同步机制,会逐条规则的同步/初始化限流、熔断资源

单条同步创建,最终落地创建/更新资源在SentinelRuleHandle#handlerRule

资源名的定义规则

选择器Id_规则名称

ruleData.getSelectorId() + "_" + ruleData.getName()


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/594958.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-07-09
下一篇2023-07-09

发表评论

登录后才能评论

评论列表(0条)

    保存