它主要通过 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()
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)