【微服务】[限流Sentinel]【实战2】----Sentinel控制台规则详细讲解
英文官网 https://github.com/alibaba/Sentinel中文官网 https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8DSentinel是什么?(熔断、降级、限流)Spring Cloud Sentinel 是分布式系统的流量控制组件,可实现流量控制、熔断降级、系统负载保护等,保障服务稳定性。去哪下?与hyst
文章目录
第一章:【入门】
1、介绍
英文官网 https://github.com/alibaba/Sentinel
中文官网 https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D
Sentinel是什么?
(熔断、降级、限流)Spring Cloud Sentinel 是分布式系统的流量控制组件,可实现流量控制、熔断降级、系统负载保护等,保障服务稳定性。去哪下? https://github.com/alibaba/Sentinel/releases与hystrix对比
2、安装Sentinel控制台
(略过,参考安装笔记)
第二章:【流控规则】
- 资源名:唯一名称,默认请求路径- 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)- 阈值类型/单机阈值: - QPS(每秒钟的请求数量):当调用该api的QPS达到阈值的时候,进行限流 - 线程数:当调用该api的线程数达到阈值的时候,进行限流- 是否集群:不需要集群- 流控模式: - 直接:api达到限流条件时,直接限流 - 关联:当关联的资源达到阈值时,就限流自己 - 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】流控效果:- 快速失败:直接失败,抛异常- Warm Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值- 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效
1、[流控模式]—直接、关联、链路
【关联例子】
当B接口达到阈值,A接口限流。例如:支付接口B到阈值快顶不住了,限制下单A接口。
可自行测试。大批量线程高并发访问B,导致A失效了!!
【链路例子】
根据上游来源的路径做限制。
2、 [流控效果]—快速失败、预热、排队

快速失败(默认的流控处理)
直接失败,抛出异常 Blocked by Sentinel (flow limiting)
Warmup预热
公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值
限流 冷启动

单机赋值10,预热5秒=====意思是低流量时候,突然来大流量,此时5秒内只能让10/3=3 个成功,5秒后才能达到10个。
应用场景
秒杀场景,一开抢,可能会系统崩溃,先预热。
排队等待
匀速排队,阈值必须设置为QPS,超过了会让队列里,挨个迅速通过,等待超过时间就返回错误
第三章:【熔断降级规则】
熔断是什么?类似于电路中的保险丝,到达阈值会跳闸一段时间,然后再恢复
熔断策略有【慢调用比例】【异常比例】【异常数】配置
1、[慢调用比例]

以上配置的说明:
在每 1 秒的统计周期内,如果响应时间超过 200 毫秒的请求占比达到 50% 且请求数量不少于 5 个,则触发熔断,熔断时长为 10 秒。
这样可以有效防止该资源因慢调用导致系统性能下降或崩溃。
2、[异常比例]

以上配置的说明:
统计一秒内的请求,数量大于5且异常比例超过50% ,则触发熔断,该资源在接下来的 10 秒内不再接受请求。
1、[异常数]

以上配置的说明:
统计一秒内的请求,请求数量大于10且异常数超过3个 ,则触发熔断,该资源在接下来的 10 秒内不再接受请求。
第四章:【热key限流】
可以针对对接口的参数进行设置,如发送短信,key为手机号,一分钟内只能发送一次,防止恶意多发。
@GetMapping("/sendSms")
@SentinelResource(value = "sentinelSendSms",blockHandler = "sendSmsHandler")
public String testHotKey(@RequestParam(value = "phone",required = false) String phone,
@RequestParam(value = "name",required = false) String name) {
//int age = 10/0;
return "------testHotKey";
}
//兜底方法
public String sendSmsHandler (String phone, String name, BlockException exception){
return "------deal_testHotKey,o(╥﹏╥)o";
}
配置如下:
根据参数手机号(下标为0),限制60秒内只能请求一次,多的执行兜底。
第五章:【系统规则】
系统规则:系统级别的,比如系统到达配置的qps 20万, 触发默认堵塞处理器。

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.system.SystemBlockException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
@ControllerAdvice
public class CustomSentinelBlockHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
// 区分异常类型(系统规则触发的是SystemBlockException)
String msg;
int code = 500;
if (e instanceof SystemBlockException) {
msg = "系统资源紧张,请稍后再试(触发系统规则保护)";
code = 10001; // 自定义业务错误码
} else {
msg = "请求被限流,请稍后再试";
code = 10002;
}
// 返回JSON格式响应
response.setContentType("application/json;charset=UTF-8");
response.getWriter().write("{\"code\":" + code + ",\"msg\":\"" + msg + "\",\"data\":null}");
}
}
第六章:【持久化】
一旦我们重启应用,Sentinel规则将消失,生产环境需要将配置规则进行持久化
实现:服务配置并连接到nacos做持久化,配置规则到json里。(引入相关nacos依赖)
<!-- Sentinel 集成 Nacos 数据源的关键依赖(必须添加) -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<!-- 版本需与Sentinel核心依赖版本一致,如1.8.6 -->
</dependency>
配置:略过其他配置只显示要添加的配置。
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 #配置Sentinel 控制台 地址
port: 8719
datasource: #持久化配置
ds1:
nacos:
server-addr: localhost:8848
dataId: cloudalibaba-sentinel-service
groupId: DEFAULT_GROUP
data-type: json
rule-type: flow
添加Nacos业务规则配置(配置列表–新建配置)
添加内容
[
{
"resource": "/retaLimit/byUrl",// 资源名称
"limitApp": "default",// 来源应用
"grade": 1,// 阈值类型,0表示线程数,1表示QPS;
"count": 1,// 单机阈值;
"strategy": 0,// 流控模式,0表示直接,1表示关联,2表示链路;
"controlBehavior": 0,// 流控效果,0表示快速失败,1表示Warm Up,2表示排队等待;
"clusterMode": false // 是否集群
}
]
resource: 资源名称;
limitApp: 来源应用;
grade: 阈值类型,0表示线程数,1表示QPS;
count: 单机阈值;
strategy: 流控模式,0表示直接,1表示关联,2表示链路;
controlBehavior: 流控效果,0表示快速失败,1表示Warm Up,2表示排队等待;
clusterMode: 是否集群。
重启服务,就会出现(持久化的)
更多推荐


所有评论(0)