Sentinel
熔断降级: 削峰填谷,集群流量控制,熔断
实时监控: 控制台,看到接入单台机器秒级数据
SPI扩展点: 简单易用,SPI扩展接口,快速制定逻辑,规则
官网官网中文官中控制台
Docker 安装客户端
docker pull bladex/sentinel-dashboard
docker run --name sentinel -d -p 8858:8858 -d bladex/sentinel-dashboard
访问地址http://localhost:8858
账户密码: sentinel
熔断降级
服务之间调用时,调用路径中某一个资源出现了不稳定或者不可用,最终会导致请求发生积压,熔断降级,是为了解决这样的问题。
熔断降级: 当请求时间过长,或者异常比例提升,则对这个资源的请求做限制,让请求快速失败,等避免其他的业务受到影响,造成服务雪崩
@SentinelResource 属性 ??
注解方式 不支持 private 方法
属性 | 描述 |
---|
value | 资源名称(必填) | entryType | 资源调用方向,可选项(默认EntryType.OUT) | resourceType | 资源分类 | blockHandler | 对应处理 BlockException 的方法(方法需要 public) | blockHandlerClass | 处理Class 对象,方法必须为 static | fallbackClass | 抛出异常的时候 提供 fallback 处理逻辑 | execptionsToTrace | 异常类跟踪列表(默认为 Throwable.class) | execptionsTolgnore | 排除掉的异常类型(指定异常 不会进入异常统计,和fallback逻辑,只是原样抛出) | fallback | 用于抛出异常的时候提供 fallback 处理 |
@SentinelResource(value = TEST, blockHandler = "methodA",fallback ="methodB" )
@GetMapping("annotation")
public String hello(){
return "注解方式";
}
public String methodA(BlockedException e) {
e.printStackTrace();
return "注解方式限流!";
}
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();
rule.setResource(HELLO);
rule.setGrade(RuleConstant.FLOW_GRADE_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);
rule.setTimeWindow(5);
rule.setCount(0.005);
rule.setMinRequestAmount(1);
rule.setStatIntervalMs(1000);
rule.setSlowRatioThreshold(0.5);
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}
动态扩展
通过java代码设置,或者通过控制台手动设置,实际使用中并不方便。
Sentinel的DataSoure 接口提供了对接任意数据源的能力。官网说明
将规则推送到规则中心,客户端实现 ReadableDataSource 接口监听注册中心来实现获取规则变更
底部
|