我是靠谱客的博主 哭泣钢笔,最近开发中收集的这篇文章主要介绍Sentinel介绍,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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;
}

流控模式分类

直接流控

关联流控

链路流控

最后

以上就是哭泣钢笔为你收集整理的Sentinel介绍的全部内容,希望文章能够帮你解决Sentinel介绍所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部