发布时间:2024-06-14 14:01
熔断降级: 削峰填谷,集群流量控制,熔断
实时监控: 控制台,看到接入单台机器秒级数据
SPI扩展点: 简单易用,SPI扩展接口,快速制定逻辑,规则
官网官网中文官中控制台
# 拉取镜像
docker pull bladex/sentinel-dashboard
# 运行实例
docker run --name sentinel -d -p 8858:8858 -d bladex/sentinel-dashboard
访问地址http://localhost:8858
账户密码: sentinel
服务之间调用时,调用路径中某一个资源出现了不稳定或者不可用,最终会导致请求发生积压,熔断降级,是为了解决这样的问题。
熔断降级: 当请求时间过长,或者异常比例提升,则对这个资源的请求做限制,让请求快速失败,等避免其他的业务受到影响,造成服务雪崩
注解方式 不支持 private 方法
属性 | 描述 |
---|---|
value | 资源名称(必填) |
entryType | 资源调用方向,可选项(默认EntryType.OUT) |
resourceType | 资源分类 |
blockHandler | 对应处理 BlockException 的方法(方法需要 public) |
blockHandlerClass | 处理Class 对象,方法必须为 static |
fallbackClass | 抛出异常的时候 提供 fallback 处理逻辑 |
execptionsToTrace | 异常类跟踪列表(默认为 Throwable.class) |
execptionsTolgnore | 排除掉的异常类型(指定异常 不会进入异常统计,和fallback逻辑,只是原样抛出) |
fallback | 用于抛出异常的时候提供 fallback 处理 |
/*
value : 资源名
blockHandler 限流处理方法
*/
@SentinelResource(value = TEST, blockHandler = \"methodA\",fallback =\"methodB\" )
@GetMapping(\"annotation\")
public String hello(){
return \"注解方式\";
}
/*
方法被限流时,调用此方法
参数需要与 原方法参数一致
*/
public String methodA(BlockedException e) {
e.printStackTrace();
return \"注解方式限流!\";
}
/*
服务熔断降级处理,参数与原方法一样,最多 最后 加一个 Throwable 参数
*/
public String methodB(Throwable e) {
System.out.println( e.getMessage());
return \" 服务被熔断处理==\"+ e.getMessage();
}
选项 | 说明 |
---|---|
资源名 | 唯一名称,默认请求路径 |
针对来源 | Sentinel可以针对调用者进行限流,填写微服务名称,默认default(不区分来源) |
阈值类型/单机阈值 | QPS:(每秒请求数量):当调用该api的 QPS 达到阈值的时候,进行限流 线程数:当调用该api 的线程达到阈值的时候,进行限流 |
是否集群 | 不需要集群 |
流控模式 | 直接: api达到限流条件时,直接限流 关联: 当关联的资源达到限流阈值时,就限流自己 链路: 只记录自定链路上的流量(指定资源从入口资源进来的流量,如果达到峰值,就进行限流)【API级别针对来源】 |
流控效果 | 快速失败:直接失败,抛异常 Warm Up: 根据coldFactor(冷加载因子,默认3)的值,从阈值/coldFactor,经过预热时长才达到设置的QPS阈值 排队等待: 匀速排队,让请求以匀速通过,阈值类型必须设置为QPS,否则无效 |
/**
* 当前类的构造函数执行之后执行此方法
*/
@PostConstruct
public void initFlowRules() {
// 创建存放流控规则的集合
List<FlowRule> rules = new ArrayList<>();
// 创建流控规则
FlowRule rule = new FlowRule();
// 定义资源,表示Sentinel会对哪个资源生效
rule.setResource(HELLO);
// 定义流控规则的类型
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
// 定义QPS每秒能通过的请求数
rule.setCount(2);
// 将流控规则存放在集合中
rules.add(rule);
// 加载流控规则
FlowRuleManager.loadRules(rules);
}
}
流控规则 FlowRule
属性 | 说明 |
---|---|
resource | 资源名,资源名是限流规则的作用对象 |
limitApp | 流控针对的调用来源,若为default则不区分调用来源 |
grade | 限流阈值类型,QPS模式(1) 或并发先线程模式(0) |
count | 限流阈值 |
strategy | 调用关系限流策略:直接、链路、关联 |
controlBehavior | 流量控制效果(直接拒绝、Warm Up、匀速排队) |
clusterMode | 是否集群限流 |
同一个资源有多个限流规则,检测时会依次检测
资源被降级后,默认行为抛出
DegradeException
同一个资源可以有多个降级规则
熔断策略
慢调用比例(SLOW_REQUEST_RATIO)
:选择慢调用比例作为阈值,需要设置RT(最大响应时间)
,请求的响应时间大于,最大响应时间,统计为慢调用,单位统计时长(statlntervalMs)内请求数目大于设置的最小请求数目,并且慢调用比例大于阈值,则接下来的熔断时长内请求会自动熔断,经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN状态),若接下来的一个请求响应时间小于设置慢调用RT
则结束熔断,若大于RT
则再次熔断。异常比例(ERROR_RATIO)
:当单位统计时长(statlntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF_OPEN状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则再次被熔断。异常比率的阈值范围是[0.0,1.0]
代表0%-100%。异常数(ERROR_COUNT)
: 当单位统计时长内的异常数目超过阈值后会自动进行熔断。进过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN状态),若接下来的一个请求成功完成(没有错误),则结束熔断,否则再次被熔断。异常降级仅针对业务异常,对Sentinel限流降级本身(BlockException) 不生效
DegradeRule 属性
属性 | 说明 |
---|---|
resource | 资源名,即规则的作用对象 |
grade | 熔断策略,支持慢调用比例/异常比例/异常策略(默认 慢调用比例) |
count | 设置 RT 值 |
timeWindow | 熔断时长,单位 s |
minRequestAmount | 熔断出触最小请求数,请求数小该值时即使用异常比率超出阈值也不会熔断(1.7.0引入 默认是 5) |
statIntervalMs | 统计时长(单位ms),如60*1000(1.8.0 引入 默认是1000ms) |
slowRatioThreshold | 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入) |
// 生成 熔断降级规则
@PostConstruct
public void initDegradeRules() {
//存放熔断降级规则的集合
ArrayList<DegradeRule> rules = new ArrayList<>();
// 创建规则
DegradeRule rule = new DegradeRule();
// 规则名
rule.setResource(\"degradeDemo\");
// 降级类型
rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
// 定义降级熔断时间 单位 s
rule.setTimeWindow(5);
// 定义慢调用临 界RT(超出该值记为慢调用 单位s)
rule.setCount(0.005);
// 定义熔断出大最小请求数
rule.setMinRequestAmount(1);
// 定义统计时长 单位s
rule.setStatIntervalMs(1000);
// 定义慢调用比例阔值
rule.setSlowRatioThreshold(0.5);
//加入 规则
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}
通过java代码设置,或者通过控制台手动设置,实际使用中并不方便。
Sentinel的
DataSoure
接口提供了对接任意数据源的能力。官网说明将规则推送到规则中心,客户端实现
ReadableDataSource
接口监听注册中心来实现获取规则变更