• Sentinel实现服务降级并与api解耦


    Sentinel怎样实现熔断降级

    熔断降级介绍

    sentinel支持服务的熔断降级

    熔断类似于保险丝,在超出了阈值的情况下,在一定的时间内不会执行业务逻辑,直接执行服务降级的方法。服务降级利用本地fallback方法,返回一个有好的提示给客户端,不会真实的去执行业务逻辑。除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。

    降级的策略

    1.平均响应时间 (DEGRADE_GRADE_RT)
    当 1s 内持续进入 5 个请求,对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位),那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。

    2.异常比例(DEGRADE_GRADE_EXCEPTION_RATIO)
    当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

    3.异常数(DEGRADE_GRADE_EXCEPTION_COUNT)
    当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。

    平均的响应时间

    image-20221126105715934

    如果在1s秒,平均有5个请求的响应时间大于配置的10rt毫秒时间 阈值,则会执行一定时间窗口的熔断和降级。

    基于平均相应时间实现降级代码:

    @SentinelResource(value = "getOrderDowngradeRtType", fallback = "getOrderDowngradeRtTypeFallback")
    @RequestMapping("/getOrderDowngradeRtType")
    public String getOrderDowngradeRtType() {
        try {
            Thread.sleep(300);
        } catch (Exception e) {
        }
        return "getOrderDowngradeRtType";
    }
    
    public String getOrderDowngradeRtTypeFallback() {
        return "服务降级啦,当前服务器请求次数过多,请稍后重试!";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    异常的比例

    image-20221126105748147

    当我们每秒的请求大于5的时候,会根据一定比例执行我们的熔断降级的策略。

    @SentinelResource(value = "getOrderDowngradeErrorType", fallback = "getOrderDowngradeErrorTypeFallback")
    @RequestMapping("/getOrderDowngradeErrorType")
    public String getOrderDowngradeErrorType(int age) {
        int j = 1 / age;
        return "正常执行我们的业务逻辑";
    }
    
    public String getOrderDowngradeErrorTypeFallback(int age) {
        return "服务降级啦,当前服务器请求次数过多,请稍后重试!";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    异常的次数

    image-20221126105817163

    当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。

    服务降级解耦

    传统的降级方式是通过@SentinelResource注解以及里面的fallback属性来实现的,这种方式比较大的问题是注解与接口依旧有一定耦合,需要让降级与接口完全隔离,这时我们可以通过openFeign声明的接口进行实现来达到目的,下面介绍一下通过实现类的方式实现

    被调用方接口服务,业务中故意包含报错

    image-20221126112123481

    调用方api层,调用本微服务中声明的需要被调用的user服务

    image-20221126112504661

    调用方声明的UserService接口

    image-20221126112744073

    调用方的服务降级实现类UserFallbackServiceImpl,这里需要注意的是一定要记得加@Component,否则会导致项目都无法启动

    image-20221126112932427

    测试

    浏览器中访问接口,提示自定义的降级信息,成功实现

    image-20221126113140594

  • 相关阅读:
    Java面试题(每天10题)-------连载(28)
    Java回顾-IO流-节点流/缓冲流/对象流/转换流
    Java Web——TomcatWeb服务器
    SpringMVC 学习(六)乱码问题
    2024年AI助力研发:内容驱动下的全新变革与展望
    Echarts 实现X轴多维效果
    通讯协议介绍&CoAP 协议解析
    C++STL-string类的实现(下)
    QT—信号与槽详解
    离线配置ohmyzsh nvim tldr conda ssh nvm
  • 原文地址:https://blog.csdn.net/qq_42910468/article/details/128049851