之八 2流高手速成记:基于Sentinel实现微服务体系下的限流与熔断( 三 )


【之八 2流高手速成记:基于Sentinel实现微服务体系下的限流与熔断】下边还有一项/person/select(开头多个/),这个又是什么?这里先直接告诉大家答案——Sentinel默认会将所有Controller添加请求映射的方法视为资源
那我们额外添加一个@SentinelResource注解是否多此一举?答案是否,因为Controller生成的默认Sentinel资源是不带自定义规则触发方法的
因此@SentinelResource依然是有必要的,待本篇内容结束之后,大家可以自行验证这个说法
而从第二项【簇点链路】中,我们也能看到person/select和/person/select本身具备从属关系
之八 2流高手速成记:基于Sentinel实现微服务体系下的限流与熔断

文章插图
流控规则第三项【流控规则】对应了本节标题中提到的【限流】
之八 2流高手速成记:基于Sentinel实现微服务体系下的限流与熔断

文章插图
这里涉及到三个概念:
阈值类型
QPS —— 服务器每秒接受的最大请求数
线程数 —— 服务器能容忍的最大线程占用数,一般用于保护服务器的业务线程池不被耗尽
流控模式
直接 —— 默认项,接口到达限流要求时,规则直接生效
关联 —— 当关联在资源到达阈值时,直接限流自己,一般应用于效率让步的诉求
链路 —— 记录链路流量,当入口资源到达阈值,则限流自己
流控效果
快速失败 —— 默认项,超出阈值后新请求直接拒绝
排队等待 —— 让请求匀速通过(漏桶算法),每个请求在一个允许的延迟时长范围内
Warm up —— 冷启动模式,防止流量瞬间暴增直接将服务压垮,而是逐渐外放请求上限
我们先按图所示创建一个最简单的限流规则 —— QPS阈值为1,直接快速失败
而后我们启动两个post,同时向服务器端发送select请求,则结果对比如下:
之八 2流高手速成记:基于Sentinel实现微服务体系下的限流与熔断

文章插图
 
之八 2流高手速成记:基于Sentinel实现微服务体系下的限流与熔断

文章插图
由于QPS指定的阈值为1,因此同时发起的第二个请求会因触发限流规则而执行blockHandler方法
而我们针对 阈值类型、流控模式、流控效果 这三个指标交叉组合,可以创造出适用于各种服务器场景之下的限流规则
再比如我们按如下设置限流规则
之八 2流高手速成记:基于Sentinel实现微服务体系下的限流与熔断

文章插图
这种设置方式代表我们所能允许select方法同时请求的上限值为2000,但是这个数值是在5分钟(300秒)之间逐步放开的,比如我们用这种模式可以应对类似双11期间大力度优惠而带来的突发流量洪峰
通过【限流】可以很好的起到保护服务器的作用,在特殊时期针对流量进行削峰填谷,使得服务器处在一个长期稳定的环境
降级规则第四项【降级规则】对应了本节标题中的【熔断】
之八 2流高手速成记:基于Sentinel实现微服务体系下的限流与熔断

文章插图
所谓“熔断”,其实最早这个概念来源于家庭电路中的保险丝,当家庭中的某件家用电器功率异常,或者某处电路出现短路,
为防止电流过大造成更大的损失,此刻保险丝即会【熔断】,造成我们日常所说的“掉闸”
熔断策略
慢调用比例 —— 慢调用其实就是响应超过预定时长,当这样的调用到达一定比例后,触发降级规则
异常比例 —— 方法调用出现异常数到达一定比例后,触发降级规则
异常数 —— 方法调用出现异常到达一定数目后,触发降级规则
我们按照图中所示创建一条降级规则,其含义为【任意1次并发请求(QPS)中有1次异常则触发熔断规则,时长为10秒】

经验总结扩展阅读