Sentinel流量控制官方文档
https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6
Sentinel流量控制
可以在Sentinel控制台-簇点链路-针对不同的接口编写不同的流量控制规则
image.png名词解释
资源名: 唯一名称,默认请求路径
针对来源: Sentine可以针对调用者进行限流,填写微服务名,默认default(不区分来源)
阈值类型/单机阈值:
- QPS(每秒钟的请求数量):当调用该api达到阈值的时候,进行限流
- 线程数: 当调用该api的线程数达到阈值时,进行限流
是否集群: 不需要集群
流控模式:
- 直接:api达到限流条件时,直接限流
- 关联:当关联的资源达到阈值时,就限流自己
- 链路: 只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流,api级别的针对来源)
流控效果:
- 快速失败:直接失败,抛出异常
- Warm Up: 根据codeFactor(冷加载因子,默认3)的值,从阈值除以codeFactor,经过预热时长,才达到设置的QPS阈值
- 排队等候: 让无法立即处理的请求进行排队等候,阈值类型必须设置为QPS,否则无效
阈值类型
这里我编写一个接口/testA,并接入了Sentinel的监控。
QPS:每秒请求数
image.png当接口/testA,QPS超过每秒钟1个请求数时,会直接返回失败
image.png线程数:指服务端开启的线程的数量而不是接口的请求数量,这里手动刷新操作不好测试效果,借助了Jmeter
image.png
当服务端超过一个线程时,会直接返回失败。
并发十个请求线程,只有两个成功返回正确消息,其余八个都被Sentinel限流
流控模式
直接:当api达到限流条件时,直接限流,这个比较好理解
关联:当与A关联的资源B达到了阈值后,就限流A,这里我编写了两个测试接口,testA与testB。
image.png当testB接口QPS超过1时,限流testA接口。
流控效果
快速失败:当达到阈值时,直接返回Blocked by Sentinel(flow limiting)
image.pngWarm Up(预热): 即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。
image.png排队等候: 当超过阈值时,让请求进行匀速排队。阈值类型必须设置为QPS,否则无效。
适用场景:主要用于处理间隔性突发的流量,例如消息队列。想象一下这样的场景,在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。
image.png image.png使用@SentinelResource配置流控规则
controller
/**
* 使用@SentinelResource标签开启热点参数限流功能
* @SentinelResource(value)对应Sentinel控制台-流控规则-资源名
* @SentinelResource(blockHandeler)指定流控规则生效后的处理函数
*/
@GetMapping("byResource")
@SentinelResource(value = "byResource", blockHandler = "handleException")
public String byResource(){
return "----------------- 按资源名称设置流控规则 -------------------";
}
public String handleException(BlockException exception){
return "-------------------- 流控规则生效后执行的函数 ------------------";
}
Sentinel控制台
image.png使用@SentinelResource标签的好处在于能够自定义流控规则生效后返回的消息。
网友评论