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

流控模式分类

直接流控

关联流控

链路流控

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值