Sentinel 熔断与限流

2023-10-30

想要学习完整SpringCloud架构可跳转SpringCloud Alibaba微服务分布式架构

1 是什么?

分布式系统的流量防卫兵

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。

Sentinel以流星为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

2 特征

丰富的应用场景: Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。

完备的实时监控: Sentinel同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。

广泛的开源生态: Sentinel提供开箱即用的与其它开源框架/库的整合模块,例如与Spring Cloud、Dubbo、gRPC的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。

完善的SPI扩展点: Sentinel提供简单易用、完善的SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

3 特性

在这里插入图片描述

4 与Hystrix的区别
Hystrix Sentinel
需要手工搭建监控平台:DashBoard 单独一个组件独立出来
没有一套Web界面可以进行更加颗粒化的配置流量监控、速率控制、服务熔断、服务降级 支持界面化的细粒度统一配置
5 两个部分

核心库(Java客户端)不依赖任何框架/库,能够运行于所有Java运行时环境,同时对 Dubbo /Spring Cloud 等框架也有较好的支持。

控制台(Dashboard)基于Spring Boot 开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。

启动命令:

java -jar sentinel-dashboard-1.7.1.jar
6 应用
6.1 依赖
        <!-- SpringCloud alibaba sentinel-datasource-nacos 持久化 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

        <!-- SpringCloud alibaba sentinel -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
6.2 配置文件
server:
  port: 8401
  servlet:
    context-path: /sentinel
spring:
  # 服务名称
  application:
    # 订单服务
    name: nacos-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # Nacos 服务注册中心地址
        namespace: 13e20987-6fcc-41d6-a358-e16b86bce522
      config:
        server-addr: localhost:8848 # Nacos 配置中心地址
        file-extension: yaml # 指定yaml格式的配置
        group: DEV_GROUP
        namespace: 13e20987-6fcc-41d6-a358-e16b86bce522
    sentinel:
      transport:
        # 配置Sentinel dashboard地址
        dashboard: localhost:8080
        # 默认8719端口,加入被占用会自动从8719开始依次+1扫描,知道找到未被占用的端口
        port: 8719
management:
  endpoints:
    web:
      exposure:
        include: "*"
7 流量配置规则
  • 资源名: 唯一名称,默认请求路径

  • 针对来源: Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)

  • 阈值类型/单机阈值:

    • QPS(每钟的请求数量): 当调用该api的QPS达到阈值的时候,进行限流。
    • 线程数: 当调用该api的线程数达到阈值的时候,进行限流
  • 是否集群: 不需要集群

  • 流控模式:

    • 直接: api达到限流条件时,直接限流
    • 关联: 当关联的资源达到阈值时,就限流自己
    • 链路: 只记录指定链路上的流星(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】
  • 流控效果:

    • 快速失败: 直接失败,抛异常
    • Warm up: 根据codeFactor (冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值
    • 排队等待: 匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效
7.1 直接(默认)

==》快速失败
在这里插入图片描述
在这里插入图片描述

7.2 关联

在这里插入图片描述

7.3 Warm Up 预热

Warm Up ( RuleConstant.CONTROL_BEHAVIOR_MARM_UuP)方式,即预热/冷启动方式。

当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。

默认 coldFactor为3,即请求QPS从threshold / 3 开始,经预热时长逐渐升致设定的QPS阈值。

在这里插入图片描述

7.4 排队等待

匀速排队( RuleConstant.CONTROL_BEHAVIOR_RATE_LINITER )方式会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法

在这里插入图片描述

用于处理间隔性突发的流量,例如消息队列。

在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。

在这里插入图片描述
在这里插入图片描述

8 熔断降级
8.1 概述

除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出DegradeException )。

Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错谒。

当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出DegradeException) 。

RT(平均响应时间,秒级)
  • 平均响应时间超出阈值且在时间窗口内通过的请求>=5,两个条件同时满足后触发降级
  • 窗口期过后关闭断路器
  • RT最大4900(更大的需要通过-Dcsp.sentinel.statistic.max.rt=XXXX才能生效)

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

在这里插入图片描述

在这里插入图片描述

每秒钟进来10个线程,我们Sentinel上配置的是希望200毫秒处理完本次任务,如果没有处理完,在未来1秒钟的时间窗口内,断路器打开,微服务不可用。

异常比列(秒级)

QPS >= 5且异常比例(秒级统计)超过阈值时,触发降级;时间窗口结束后,关闭降级

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

在这里插入图片描述

异常数(分钟级)

异常数(分钟统计)超过阈值时,触发降级;时间窗口结束后,关闭降级

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

时间窗口一定要大于等于60S。

8.2 Sentinel断路器没有半开状态

半开状态:系统自动会去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。(Hystrix)

注意:异常降级仅针对业务异常,对Sentinel限流降级本身的异常(BlockException)不生效。为了统计异常比例或异常数,需要通过Tracer.trace(ex)记录业务异常。

9 热点规则

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的Top K数据,并对其访问进行限制。

比如:

  • 商品ID为参数,统计—段时间内最常购买的商品ID并进行限制
  • 用户ID为参数,针对一段时间内频繁访问的用户ID进行限制

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

Sentinel利用LRU策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。

源码:

Entry entry = null;
try {
  entry = SphU.entry(resourceName,EntryType.IN1,paramA,paramB)// Your logic here.
}catch (BlockException ex) {
     //Handle request rejection.
}finally{
   if (entry != null) {
       entry.exit(1,paramA,paramB);
    }
}

测试案例:

    @GetMapping("/testHotKey")
    @SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
    public String testHotKey(@RequestParam(value = "p1",required = false)String p1,
                             @RequestParam(value = "p2",required = false)String p2){
        return "----testHotKey";
    }
    //兜底方法
    public String deal_testHotKey(String p1, String p2, BlockException exception){
        //Sentinel系统默认提示:Blocked by Sentinel (flow limiting)
        return "deal_testHotKey,o(╥﹏╥)o";
    }

在这里插入图片描述

​ @SentinelResource(value = “testHotKey”,blockHandler = “deal_testHotKey”)

第一个参数只要QPS超过每秒1次,马上降级处理,用自定义的deal_testHotKey兜底方法

9.1 参数例外项

在这里插入图片描述

9.2 运行时异常

​ @SentinelResource

处理的是Sentinel控制台配置的违规情况,有blockHandler 方法配置的兜底处理

主管配置出错,运行出错该走异常走异常

10 系统规则

Sentinel系统自适应限流从整体维度对应更入口流量进行控制,结合应用的Load、CPU使用率、总体平均RT、入口QPS和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

系统规则支持以下的模式:

  • Load自适应(仅对Linux/Unix-like机器生效):系统的load1作为启发指标,进行自适应系统保护。当系统load1超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR阶段)。系统容量由系统的maxQps * minRt估算得出。设定参考值一般是cPUcores * 2.5。
  • CPU usage (1.5.0+版本):当系统CPU使用率超过阈值即触发系统保护(取值范围0.0-1.0),比较灵敏。
  • 平均RT:当单台机器上所有入口流量的平均RT达到阈值即触发系统保护,单位是毫秒。·并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口QPS:当单台机器上所有入口流量的QPS达到阈值即触发系统保护。
11 @SentinelResource

自定义异常兜底处理类

public class CustomerBlockFallback {
    public static CommonResult handlerFallback(@PathVariable("id") Long id,Throwable e){
        return CommonResult.BlockHandler("兜底异常--Fallback,exception内容:"+e.getMessage());
    }
}

自定义Sentinel控制台配置违规处理类

public class CustomerBlockHandler {
    public static CommonResult handlerblock(@PathVariable("id") Long id, BlockException exception) {
        return CommonResult.BlockHandler(exception.getMessage());
    }
}

业务层

@Service
public class PaymentServiceImpl {
    @Resource
    private PaymentService paymentService;
    @SentinelResource(value = "getPaymentById",
            fallbackClass = CustomerBlockFallback.class,
            fallback = "handlerFallback", //fallback只负责业务异常
            blockHandlerClass = CustomerBlockHandler.class,
            blockHandler = "handlerblock", //只负责Sentinel控制台配置违规
            exceptionsToIgnore = {IllegalArgumentException.class} //排除该异常的兜底方法
    )
    public CommonResult<Payment> getPaymentById(Long id) {
        if (id<0){
            throw new IllegalArgumentException("IllegalArgumentException,非法参数异常");
        }
        CommonResult<Payment> paymentById = paymentService.getPaymentById(id);
        if (paymentById.getData()==null){
            throw new NullPointerException("NullPointerException,该ID没有对应记录,空指针异常");
        }
        return paymentById;
    }
}
12 熔断框架比较
Sentinel Hystrix resilience4j
隔离策略 信号量隔离(并发线程数限流) 线程池隔离/信号量隔离 信号量隔离
熔断降级策略 基于响应时间、异常比例、异常数 基于异常比例 基于异常比例、响应时间
实时统计实现 滑动窗口(LeapArray) 滑动窗口(基于RxJava) Ring Bit Buffer
动态规则配置 支持多种数据源 支持多种数据源 有限支持
扩展性 多个扩展点 插件的形式 接口的形式
基于注解的支持 支持 支持 支持
限流 基于QPS,支持基于调用关系的限流 有限的支持 Rate Limiter
13 Sentinel的规则持久化

解决方案:保存进Nacos(官方要求)、Mysql、Redis

13.1 依赖
        <!-- SpringCloud alibaba sentinel-datasource-nacos 持久化 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

11.13.2 配置文件

spring:
  # 服务名称
  application:
    # 订单服务
    name: nacos-payment-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # Nacos 服务注册中心地址
        namespace: 13e20987-6fcc-41d6-a358-e16b86bce522
      config:
        server-addr: localhost:8848 # Nacos 配置中心地址
        file-extension: yaml # 指定yaml格式的配置
        group: DEV_GROUP
        namespace: 13e20987-6fcc-41d6-a358-e16b86bce522
    sentinel:
      transport:
        # 配置Sentinel dashboard地址
        dashboard: localhost:8080
        # 默认8719端口,加入被占用会自动从8719开始依次+1扫描,知道找到未被占用的端口
        port: 8719
      datasource:
        dsl:
          nacos:
            server-addr: localhost:8848
            namespace: 13e20987-6fcc-41d6-a358-e16b86bce522
            dataId: nacos-payment-consumer
            groupId: DEV_GROUP
            data-type: json
            rule-type: flow

在这里插入图片描述

resource: 资源名称;

limitApp: 来源应用;

grade: 阈值类型,0表示线程数,1表示QPS;

count: 单机阈值;

strategy: 流控模式,0表示直接,1表示关联,2表示链路;

controlBehavior: 流控效果,0表示快速失败,1表示Warm Up,2表示排队等待;

clusterMode: 是否集群。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sentinel 熔断与限流 的相关文章

随机推荐

  • jsp页面ajax用法,在jsp中使用jquery的ajax

    jQuery ajax url getAssessmentStaffEvaluation html type post data userId userid startDate startDate endDate endDate dataT
  • 使用3D跟踪的被动棒的大型显示器交互技术

    VisionWand 使用3D跟踪的被动棒的大型显示器交互技术 ABSTRZCT 对一种作为与大型显示器交互的新输入机制 利用计算机视觉技术对被动棒进行三维跟踪的技术进行了研究 我们展示了各种各样利用棒的可供性的交互技术 从而为大规模交互提
  • c语言两个无序数组的合并,c语言编程:输入两个无序数组,分别对其排序,在合并成一个有序数组,怎么编?求教育...

    include void main int a 10 b 10 c 20 i j t for i 0 i lt 10 i scanf d a i for i 0 i lt 10 i scanf d b i for i 0 i lt 10 i
  • 腾讯云轻量应用服务器配置(宝塔)

    一 在腾讯云官网购买对应服务器 官网地址 https cloud tencent com 配置操作指南 https cloud tencent com document product 213 2936 购买成功以后你就得到一个这样的页面
  • 插入数据时,保存的date类型时间字段的数据只有年月日,没有时分秒的问题

    本人使用的hibernate实体类映射方式 在实体类中date类型的注解方式 默认生成的是 Temporal TemporalType DATE 在保存的时候 此字段数据就只保留了年月日 将注解方式更改为 Temporal Temporal
  • VIM编辑文件权限问题:"E45: 'readonly' option is set (add ! to override)"

    玩阿里云更换了CentOs7 3搭建LAMP环境的时候 遇到vim打开了某个 etc下的文件 文件权限777 使用 w wq 保存的时候提示 E45 readonly option isset add to override 而用 w 提示
  • vlc android tv版,VLC播放器电视版本v1.6.0 Android版本

    VLC播放器电视版是一款非常经典且易于使用的媒体播放器 适合Android智能电视和box 它是免费的 开源的 跨平台的 广告免费的 强大的 并且有一个干净的用户界面 它支持各种流媒体协议 它有三种解码方法 完全解码 硬件解压和软件解码am
  • CVPR2022论文分享会--复盘

    小白一枚 这一天听下来最感兴趣的一篇paper 后续等小编看完这个paper在更新详细讲解 大卷积核神经网络设计 微软亚洲研究院 张祥雨 1 作者根据对ViT 的思考以及大卷积核的引出 RACV2021观点集锦 视觉transformer
  • mx-link无线打印服务器,TP-LINK USB Printer Controller(TP-LINK打印服务器)

    TP LINK USB Printer Controller是款功能实用的TP LINK打印服务器控制程序 它是使用率比较高 该软件也受到了许多用户的欢迎 主要的目的就是让用户的双频无线路由器上面的USB口对打印机的共享 让局域网主机的打印
  • 数据结构与算法(九)—— 图(无向图)

    在现实生活中 有许多应用场景会包含很多点以及点点之间的连接 而这些应用场景我们都可以用即将要学习的图这种数据结构去解决 1 图的定义及分类 图是由一组顶点和一组能够将两个顶点相连的边组成的 1 自环 即一条连接一个顶点和其自身的边 2 平行
  • 1905协议详解(二)IEEE 1905.1 拓扑发现协议

    目录 3 IEEE 1905 1 topology discovery 协议 3 1 IEEE 802 1 bridge discovery 3 2 Topology discovery protocol 3 2 1 Multicast d
  • oracle 11g---------启动、关闭数据库实例

    Oracle数据库实例的启动过程分为三个步骤 分别是 启动实例 加载数据库 打开数据库 用户可以根据实际情况的需要 以不同的模式启动数据库 启动数据库所使用的命令格式如下 startup nomount mount open force r
  • valid-palindrome

    题目描述 Given a string determine if it is a palindrome considering only alphanumeric characters and ignoring cases For exam
  • Python使用HTTP代理 Proxy

    urllib2 urllib 代理设置 urllib2是Python标准库 功能很强大 只是使用起来稍微麻烦一点 在Python 3中 urllib2不再保留 迁移到了urllib模块中 urllib2中通过ProxyHandler来设置使
  • 一文搞懂linux磁盘管理以及各场景扩容需求(实操)

    Linux常见磁盘分类 在linux上面 我们经常见到sda sdb hda hdb这样的磁盘显示 sd hd表示硬盘 sd表示硬盘是scsi接口 a表示第一块插槽盘 b表示第二块插槽盘 hd表示硬盘是IDE接口 同理a表示第一块插槽盘 b
  • Linux下.ko, .o, .so, .a, .la文件

    能上线啦 CSDN博客第二期云计算最佳博主评选 Linux下 ko o so a la文件 分类 Linux 系列 2011 12 12 23 30 2669人阅读 评论 0 收藏 举报 linux gcc makefile library
  • 微信分享审请AppID、AppSecret注意问题

    微信 审请AppID AppSecret http open weixin qq com 账号 qq com 密码 步骤 1 填写应用名称 简介相应信息 上传图片 2 填写平台信息 官网 平台类型 下载地址 应用签名 应用包名 3 提交信息
  • 面向对象是什么?

    一 面向对象是什么面向对象 Object Oriented OO 的思想对软件开发相当重要 它的概念和应用甚至已超越了程序设计和软件开发 扩展到如数据库系统 交互式界面 应用结构 应用平台 分布式系统 网络管理结构 CAD 技术 人工智能等
  • 一致性hash算法原理及golang实现

    概述 这里存在一种场景 当一个缓存服务由多个服务器组共同提供时 key应该路由到哪一个服务 这里假如采用最通用的方式key N N为服务器数目 这里乍一看没什么问题 但是当服务器数目发送增加或减少时 分配方式则变为key N 1 或key
  • Sentinel 熔断与限流

    文章目录 1 是什么 2 特征 3 特性 4 与Hystrix的区别 5 两个部分 6 应用 6 1 依赖 6 2 配置文件 7 流量配置规则 7 1 直接 默认 7 2 关联 7 3 Warm Up 预热 7 4 排队等待 8 熔断降级