1.5-Sentinel流控规则

导读:本篇文章讲解 1.5-Sentinel流控规则,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

1、新增流控规则

在Sentinel控制台中点击[簇点链路]菜单,在列表中选择一个API为它新增流控规则:

1.5-Sentinel流控规则

在弹出的对话框中,为 /share/1 这个API添加流控规则,几个核心参数设置如下:“来源应用”设置为【default】、即不区分来源、表示所有来源都受此限流规则控制,“阈值类型”设置为【QPS】、表示根据请求的QPS每秒查询率来进行限流,“流控模式”设置为【直接】、表示直接对该API地址进行限流控制,如下图所示:

1.5-Sentinel流控规则

保存上述设置的流控规则,在浏览器访问测试接口:http://localhost:8101/share/1 ,并快速刷新页面,会有如下提示:

1.5-Sentinel流控规则

由于Sentinel流控规则设置了/share/1这个API的QPS一旦达到阈值1就执行限流,所以这里访问一次这个接口,就会显示这段被限流的文本提示。

2、理解【关联】流控模式

在左侧菜单“流控规则”中找到前面设置的流控规则,点击“编辑”进行更改:

1.5-Sentinel流控规则

在弹出的对话框中,将流控模式设置为【关联】,并添加被关联的 API 地址,这里设置为监控端点的 /actuator/sentinel 这个地址:

1.5-Sentinel流控规则

这种【关联】流控模式表示的是,当关联资源 /actuator/sentinel 的阈值达到设定的 1 后,就对资源 /share/1 进行限流。

此时,编写一个类对被关联资源 /actuator/sentinel 发送批量请求,让它的QPS高于设定的阈值 1,类方法如下所示:

1.5-Sentinel流控规则

在上述发送批量请求到关联资源 /actuator/sentinel 的代码中,每隔200毫秒发送一次请求过去,直到发完10000个请求,这样被关联资源的QPS请求个数就高于设定的阈值 1;执行上述测试代码,让它持续运行着:

1.5-Sentinel流控规则

然后再通过浏览器访问资源:http://localhost:8101/share/1 ,会发现不管如何刷新它只会显示被限流:

1.5-Sentinel流控规则

3、理解【链路】流控模式

(1)编写测试案例

首先创建一个TestService类,并使用@SentinelResource注解定义一个Sentinel的资源,代码实现如下:

1.5-Sentinel流控规则

再编写一个TestController,提供两个API端点:/test/t-a、/test/t-b,这两个端点都调用了TestService中被@SentinelResource标注的common()方法,代码实现如下:

1.5-Sentinel流控规则

重启内容中心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资源,为它设置流控规则:

1.5-Sentinel流控规则

点击【+流控】,在弹出的新增流控规则界面新增规则,设置流控模式为【链路】、入口资源写API端点【/test/t-a】、单机阈值设置为1,如下图所示:

1.5-Sentinel流控规则

新增规则后,测试访问入口资源的API端点并快速刷新:http://localhost:8101/test/t-a 会发现它被限流了:

1.5-Sentinel流控规则

再访问【/test/t-b】端点:http://localhost:8101/test/t-b 会发现它没有被限流,还是可以正常访问。

4、三种流控模式说明

在添加Sentinel流控规则的时候,其中的流控模式一共有三个选项:直接、关联、链路,它们的含义如下所示:

(1)直接流控模式

即直接对设定的API进行限流,设置方式如前面所示

(2)关联流控模式

即当被关联API达到设定阈值后,对自己进行限流,关联流控模式的设置如下图所示:

1.5-Sentinel流控规则

(3)链路流控模式

只记录指定链路上的流量,链路流控模式设置如下图所示:

1.5-Sentinel流控规则

5、三种流控效果说明

  1. 快速失败

直接失败,抛出异常,并丢弃多余请求;源码所在位置如下:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController

  1. Warm Up:预热,经过设定的预热时长才到达设置的阈值

根据冷加载因子codeFactor的值(默认3),从[阈值/codeFactor]开始经过预热时长的这段时间,才打到设定的QPS阈值;假设阈值设置为100,预热时长为10,如下所示:

1.5-Sentinel流控规则

根据上述设置,它会从[100/3]开始经过10秒之后,才达到限流的阈值100。这种Warm Up预热的流控效果,可以让流量缓慢的上涨,以避免类似秒杀、抢购之类场景带来的流量暴涨的突然冲击。关于Warm Up的官方文档地址如下:https://github.com/alibaba/Sentinel/wiki/限流—冷启动 。

源码所在位置如下:com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController

  1. 排队等待:让所有请求有序通过,阈值类型只能设置为QPS

匀速排队,让请求以均匀的速度通过,阈值类型必须设置成QPS,否则无效;【排队等待】的流控效果设置如下所示:

1.5-Sentinel流控规则

在测试类中编写一个测试方法,批量发送请求到API端点 /test/t-a:

1.5-Sentinel流控规则

观察IDEA控制台会发现,请求都被接受了、没有出现被拒绝的,它们都排着队均匀的通过:

1.5-Sentinel流控规则

源码所在位置如下:com.alibaba.csp.sentinel.slots.block.flow.controller.RateLimiterController

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/10442.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!