sentinel是分布式系统的防御系统,以流量为切入点,从流量防控、熔断降级、系统负载保护等多个维度保护服务的稳定性
服务流控:防止高并发下,服务崩溃
服务熔断:为了防止服务雪崩,在发现对某些资源请求的响应缓慢或调用异常较多时,直接将对这些资源的请求掐断一段时间,而在这段时间内,执行预先定义好的降级结果,这些请求不占用系统资源,从而避免了服务雪崩的发生
服务降级:请求发送异常后,返回一个事先设定好的、用户能够接受的结果给用户,增强用户体验
降级的方式
在原方法所在类中指定方法进行降级
通过一个降级类,其中的方法都是降级方法实现降级处理
使用Feign进行降级,仅适用于Feign客户端的消费者类型,且只有类降级方式
使用
通过注解@SentinelResource(fallback="指定降级方法",fallbackClass=XXX.class)
该为通过指定类中的降级方法实现降级;
如果没有fallbackclass属性,则为通过方法降级
Feign降级
feign.sentinel.enabled=true开启feign对sentinel的支持,这个要有,否则会找不到降级类中的方法
@FeignClient(value = "msc-provider-depart",
fallback = DepartServiceImplFallBack.class)//配置feign需要访问的服务名称和降级处理类,降级处理类需要使用了@FeignClient注解的接口
降级操作
@GetMapping("/get/{id}")
@SentinelResource(value = "slowRequestsDegradeRule", fallback = "getHandlerFallback")
public Depart getHandle(@PathVariable("id") int id) {
String url = SERVICE_PROVIDER + "/provider/depart/get/" + id;
Depart depart = restTemplate.getForObject(url, Depart.class);
return depart;
}
配置文件
server: port: 8080 spring: cloud: sentinel: # 该配置能够使dashboard主动发现该应用 eager: true transport: # 配置管控台的主机地址+端口 dashboard: localhost:8888 # 传输配置数据端口 port: 8719 nacos: # 指定nacos注册中心的地址 discovery: server-addr: 127.0.0.1:8848 # 指定微服务的名称 application: name: msc-consumer-depart-circuitbreaking
使用sentinel dashboard设置规则
熔断策略:慢调用比例、异常比例、异常数
代码设置规则
public static void main(String[] args) {
SpringApplication.run(ConsumerSentinelDegradeCircuitbreakingApplication.class, args);
//通过代码的方式配置降级规则
initRule();//初始化熔断策略
}
public static void initRule() {
List<DegradeRule> rules = new ArrayList<>();
// 获取定义的规则
DegradeRule rule = slowRequestDegradeRule();
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}
//慢调用比例 熔断降级规则
public static DegradeRule slowRequestDegradeRule() {
//创建一个降级规则实例
DegradeRule rule = new DegradeRule();
//设置配置熔断规则的资源名称
rule.setResource("slowRequestsDegradeRule");
//熔断策略:慢调用比例、异常比例、异常数
rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
//设置阈值:RT的时间,单位毫秒。若一个请求获取到响应的时间超出该值,则会将该请求统计 为“慢调用”
rule.setCount(200);
//熔断恢复时间窗口,单位秒
rule.setTimeWindow(30);
//可触发熔断的最小请求数,默认是5个
rule.setMinRequestAmount(5);
// 设置发生慢调用的比例
rule.setSlowRatioThreshold(0.5);
return rule;
}
流控操作
监控应用流量的QPS或并发线程数量等指标,当达到指定的阈值时,限制后续的请求,以避免被突发高流量请求冲垮服务,保障服务的高可用性
//跨服务根据id查询
@GetMapping("/get/{id}")
@SentinelResource(fallback = "getHandlerFallback", value = "qpsFlowRule", blockHandler = "getHandlerBlock")
public Depart getHandle(@PathVariable("id") int id) {
String url = SERVICE_PROVIDER + "/provider/depart/get/" + id;
Depart depart = restTemplate.getForObject(url, Depart.class);
return depart;
}
//指定服务流控处理方法
public Depart getHandlerBlock(int id, BlockException b) {
Depart depart = new Depart();
depart.setId(-1);
depart.setName("degrade-method-id:" + id + " 流控" + b.getMessage());
return depart;
}
注意区别服务降级的方式,不要混淆了,blockHandler是服务流控后,执行的方法
通过dashboard进行流控设置
阈值类型包括QPS和线程数
通过代码的方式设置流控
public static void main(String[] args) {
SpringApplication.run(ConsumerSentinelFlowControlApplication.class, args);
//代码的方式配置流控规则
initFlowRule();//初始化流控规则
}
public static void initFlowRule() {
List<FlowRule> flowRules = new ArrayList<>();
FlowRule qpsRule = ConsumerSentinelFlowControlApplication.qpsFlowRule();
flowRules.add(qpsRule);
FlowRuleManager.loadRules(flowRules);
}
private static FlowRule qpsFlowRule() {
//创建流控规则对象
FlowRule qpsRule = new FlowRule();
//设置流控资源名称
qpsRule.setResource("qpsFlowRule");
//设置流控规则【QPS和线程数】
qpsRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//设置QPS数为1
qpsRule.setCount(1);
//值为default,表示对请求来源不做限定
qpsRule.setLimitApp("default");
return qpsRule;
}
流控模式分类
直接流控
关联流控
链路流控