1、新增流控规则
在Sentinel控制台中点击[簇点链路]菜单,在列表中选择一个API为它新增流控规则:
在弹出的对话框中,为 /share/1 这个API添加流控规则,几个核心参数设置如下:“来源应用”设置为【default】、即不区分来源、表示所有来源都受此限流规则控制,“阈值类型”设置为【QPS】、表示根据请求的QPS每秒查询率来进行限流,“流控模式”设置为【直接】、表示直接对该API地址进行限流控制,如下图所示:
保存上述设置的流控规则,在浏览器访问测试接口:http://localhost:8101/share/1 ,并快速刷新页面,会有如下提示:
由于Sentinel流控规则设置了/share/1这个API的QPS一旦达到阈值1就执行限流,所以这里访问一次这个接口,就会显示这段被限流的文本提示。
2、理解【关联】流控模式
在左侧菜单“流控规则”中找到前面设置的流控规则,点击“编辑”进行更改:
在弹出的对话框中,将流控模式设置为【关联】,并添加被关联的 API 地址,这里设置为监控端点的 /actuator/sentinel 这个地址:
这种【关联】流控模式表示的是,当关联资源 /actuator/sentinel 的阈值达到设定的 1 后,就对资源 /share/1 进行限流。
此时,编写一个类对被关联资源 /actuator/sentinel 发送批量请求,让它的QPS高于设定的阈值 1,类方法如下所示:
在上述发送批量请求到关联资源 /actuator/sentinel 的代码中,每隔200毫秒发送一次请求过去,直到发完10000个请求,这样被关联资源的QPS请求个数就高于设定的阈值 1;执行上述测试代码,让它持续运行着:
然后再通过浏览器访问资源:http://localhost:8101/share/1 ,会发现不管如何刷新它只会显示被限流:
3、理解【链路】流控模式
(1)编写测试案例
首先创建一个TestService类,并使用@SentinelResource注解定义一个Sentinel的资源,代码实现如下:
再编写一个TestController,提供两个API端点:/test/t-a、/test/t-b,这两个端点都调用了TestService中被@SentinelResource标注的common()方法,代码实现如下:
重启内容中心spca-content微服务,并分别访问上面提供的两个API端点,触发访问记录到Sentinel Dashboard控制台中;访问地址为:
http://localhost:8101/test/t-a
http://localhost:8101/test/t-b
(2)设置【链路】流控模式
打开Sentinel Dashboard控制台,在左侧菜单【簇点链路】上查看被记录的API接口,找到端点 /test/t-a 下面的common资源,为它设置流控规则:
点击【+流控】,在弹出的新增流控规则界面新增规则,设置流控模式为【链路】、入口资源写API端点【/test/t-a】、单机阈值设置为1,如下图所示:
新增规则后,测试访问入口资源的API端点并快速刷新:http://localhost:8101/test/t-a 会发现它被限流了:
再访问【/test/t-b】端点:http://localhost:8101/test/t-b 会发现它没有被限流,还是可以正常访问。
4、三种流控模式说明
在添加Sentinel流控规则的时候,其中的流控模式一共有三个选项:直接、关联、链路,它们的含义如下所示:
(1)直接流控模式
即直接对设定的API进行限流,设置方式如前面所示
(2)关联流控模式
即当被关联API达到设定阈值后,对自己进行限流,关联流控模式的设置如下图所示:
(3)链路流控模式
只记录指定链路上的流量,链路流控模式设置如下图所示:
5、三种流控效果说明
- 快速失败
直接失败,抛出异常,并丢弃多余请求;源码所在位置如下:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController
- Warm Up:预热,经过设定的预热时长才到达设置的阈值
根据冷加载因子codeFactor的值(默认3),从[阈值/codeFactor]开始经过预热时长的这段时间,才打到设定的QPS阈值;假设阈值设置为100,预热时长为10,如下所示:
根据上述设置,它会从[100/3]开始经过10秒之后,才达到限流的阈值100。这种Warm Up预热的流控效果,可以让流量缓慢的上涨,以避免类似秒杀、抢购之类场景带来的流量暴涨的突然冲击。关于Warm Up的官方文档地址如下:https://github.com/alibaba/Sentinel/wiki/限流—冷启动 。
源码所在位置如下:com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController
- 排队等待:让所有请求有序通过,阈值类型只能设置为QPS
匀速排队,让请求以均匀的速度通过,阈值类型必须设置成QPS,否则无效;【排队等待】的流控效果设置如下所示:
在测试类中编写一个测试方法,批量发送请求到API端点 /test/t-a:
观察IDEA控制台会发现,请求都被接受了、没有出现被拒绝的,它们都排着队均匀的通过:
源码所在位置如下:com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/10442.html