首页 > 其他分享 >Sentinel使用

Sentinel使用

时间:2024-07-24 11:43:58浏览次数:6  
标签:AjaxResult 请求 使用 sentinel 限流 规则 Sentinel

  1. Sentinel的作用

    用于流量控制、熔断降级等

  2. 安装与简单使用

    1. git下载Sentinel控制台https://github.com/alibaba/Sentinel/releases/tag/1.8.3,下载后直接使用java -jar 命令启动

    2. 项目引入sentinel依赖

      <dependency>
          <groupId>com.alibaba.cloud</groupId>
          <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
          <version>${spring-cloud-alibaba.version}</version>
      </dependency>
      
    3. 配置文件配置sentinel控制台地址

      spring:
        cloud:
          sentinel:
            transport:
              dashboard: localhost:8080 #配置Sentinel dashboard地址
      
    4. 启动服务,然后查看Sentinel控制台,发现是什么都没有

      访问接口后出现服务,因为它是懒加载的

  3. Sentinel的控制规则

    1. 流控规则

      • 流控模式:

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

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

      新增如下规则

      每秒点击一次接口:

      一秒点击多次

      接口被sentinel拦截并返回这个默认值

    2. 使用@SentinelResource注解修改Sentinel流控默认返回值

      在资源方法上标注@SentinelResource注解配置流控规则可以让资源限流后进入指定的限流方法以覆盖Sentinel的默认处理

       /**
        * @SentinelResource注解说明
        *  value:资源名,在sentinel控制台新增流控规则时填写的资源名
        *  blockHandler:被限流后要执行的方法,也称为兜底方法
        *  blockHandlerClass:兜底方法所在类,如果与资源方法在同一个类中可以省略不写
        */
       @GetMapping("/getOrderNo")
       @SentinelResource(value = "getOrderNoResource", blockHandler = "getOrderNoFailed", blockHandlerClass = UserController.class)
       public AjaxResult getOrderNo(String userId){
        return AjaxResult.success();
       }
      
       /**
        * 限流后执行的方法,需要和接口方法具有相同返回值和参数列表,并在参数列表最后添加一个BlockException类型参数。并且需要为static方法
        */
       public static AjaxResult getOrderNoFailed(String userId, BlockException exception){
        return AjaxResult.error("当前访问人数过多,请稍候再试");
       }
      

    3. 服务重启后发现在Sentinel控制台配置的流控规则也没有了,还需要重新配置,不是持久化的

      配置规则持久化
      • 引入sentinel-datasource-nacos依赖

        <!--sentinel-datasource-nacos 用于sentinel流控规则持久化-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.6.3</version>
        </dependency>
        
      • 在配置文件中配置数据源

        spring:
          profiles:
            active: dev
          cloud:
            sentinel:
              transport:
                dashboard: localhost:8080 #配置Sentinel dashboard地址
              datasource: # 为sentinel添加nacos数据源配置
                ds1:
                  nacos:
                    server-addr: localhost:8848
                    data-id:  ${spring.application.name}
                    data-type: json
                    rule-type: flow
        
      • 在nacos中新增配置

      • 这样sentinel就能自动去nacos中获取流控规则配置了,服务重启后规则仍然存在

    4. 熔断规则

      1. 在代码中使用注解资源id的方式先定义一个规则名称

        @GetMapping("/sentinelA")
        @SentinelResource(value = "sentinelAResource", blockHandlerClass = UserControllerHandler.class, blockHandler = "sentinelA")
        public AjaxResult sentinelA(){
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            return AjaxResult.success();
        }
        
      2. 兜底方法

        public static AjaxResult sentinelA(BlockException exception) {
            return AjaxResult.error("限流 " + exception.getRule());
        }
        
      3. 在sentinel控制台新建熔断规则(使用慢调用比例的策略)

        • 最大RT:即请求响应时间
        • 比例阈值:设置在指定请求次数(最小请求数)中响应时间超过最大RT的请求比例。值为0.1-1.0,对应1%-100%。就是说在最小请求数次请求中有百分之多少的请求响应时间超过最大RT
        • 熔断时长:当sentinel开启熔断后持续多长时间
        • 最小请求数:在一个时间窗口中最小的请求数
        • 统计时长:指定统计时间窗口大小
      4. 当比例阈值设置为0.5,其他参数如上图设置,即说明在5s内最少有2个请求经过,如果其中的50%个请求响应时间超过200ms则启动熔断机制,也就是说2个请求中有一个响应时间超过200ms那么下一次请求就会被熔断,持续时间为4s

      5. 示例

        第一次:

        第二次:

    5. 热点规则

      1. 在代码中使用注解资源id的方式先定义一个规则名称

        /**
        	 * 测试sentinel热点规则
        	 */
        @GetMapping("/sentinelHotspot")
        @SentinelResource(value = "sentinelHotspotResource", blockHandlerClass = UserControllerSentinelHandler.class, blockHandler = "sentinelHotspot")
        public AjaxResult sentinelHotspot(@RequestParam(name = "userId", required = false) String userId
                                          ,@RequestParam(name = "orderId", required = false) long orderId){
            return AjaxResult.success("sentinelHostspot获取成功");
        }
        
      2. 兜底方法

        public static AjaxResult sentinelHotspot(@RequestParam(name = "userId", required = false) String userId ,@RequestParam(name = "orderId", required = false) long orderId, BlockException exception){
            return AjaxResult.error("可能为恶意访问,热点限流:" + exception.getRule());
        }
        
      3. 在sentinel控制台新建热点规则

        • 参数索引:设置方法中指定参数,对应上边的方法即userId这个参数
        • 单机阈值:在指定统计窗口时长访问带指定参数的方法的次数
        • 对于上边代码这个设置即为:在3s内访问sentinelHotspot()接口并且带有userId参数的次数如果达到2后边的方法就限流
      4. 示例

        第一次和第二次都可以正常返回:

        第三次:

        {"msg":"可能为恶意访问,热点限流:ParamFlowRule{grade=1, paramIdx=0, count=2.0, controlBehavior=0, maxQueueingTimeMs=0, burstCount=0, durationInSec=3, paramFlowItemList=[], clusterMode=false, clusterConfig=ParamFlowClusterConfig{flowId=null, thresholdType=0, fallbackToLocalWhenFail=true, sampleCount=10, windowIntervalMs=1000}}","code":400}

标签:AjaxResult,请求,使用,sentinel,限流,规则,Sentinel
From: https://www.cnblogs.com/ccx-lly/p/18320490

相关文章

  • JavaScript中的new map()和new set()使用详细(new map()和new set()的区别)
    简介:newMap():在JavaScript中,newMap()用于创建一个新的Map对象。Map对象是一种键值对的集合,其中的键是唯一的,值可以重复。newSet():在JavaScript中,newSet()是用来创建一个新的Set对象的语法。Set对象是一种集合,其中的值是唯一的,没有重复的值。newSet()可以用......
  • 龙哥量化:MACD指标的金叉死叉,这样使用更准确(图解)
    如果您需要代写技术指标公式,请联系我。龙哥QQ:591438821龙哥微信:Long622889本文的策略过于简单,你可以加一些更复杂的限制条件1、水上金叉,可看涨;2、水上死叉,是洗盘;3、水下金叉,是反弹;4、水下死叉,赶紧跑!......
  • 本地gpt安装使用
    克隆到本地安装anaconda3具体步骤#克隆PSD:\studyfile\gpt>gitclonehttps://github.com/binary-husky/gpt_academic.gitCloninginto'gpt_academic'...remote:Enumeratingobjects:11089,done.remote:Countingobjects:100%(680/680),done.remo......
  • 在 Flask-SQLAlchemy 模型类中使用数据类装饰器?
    我编写了一个Flask-SQLAlchemy模型类,如下所示(来自此参考):fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyapp=Flask(__name__)db=SQLAlchemy(app)classUser(db.Model):__tablename__='user'user_id=db.Column(d......
  • 微信小程序 - 最新详细实现集成腾讯地图配置流程及使用教程,基于腾讯位置服务做地图标
    前言网上的教程代码太乱了,并且很少有真实请求的示例,本文提供优质配置教程及示例源码。在微信小程序开发中,详解实现接入腾讯地图教程,后台配置完整流程及使用教程,附带腾讯地图显示渲染和地图标记点,获取本机当前定位省市区或精确的经纬度,IP属地定位获取城市名称/市区名,将经......
  • Oracle 中 LISTAGG 函数的介绍以及使用
    原文地址:https://www.cnblogs.com/codeLearn/p/17931924.htmlLISTAGG函数介绍listagg函数是Oracle11.2推出的新特性。其主要功能类似于wmsys.wm_concat函数,即将数据分组后,把指定列的数据再通过指定符号合并。LISTAGG使用listagg函数有两个参数: 1、要合并的......
  • 使用 p._popen 作为 None 启动 multiprocessing.Process 时出错
    我在使用multiprocessing.Process时遇到一些问题。简单来说,我创建了多个进程p,并通过调用p.start()来启动它们。importmultiprocessingdef_start_process(args):#someothercodestogeneratesome_argsq=multiprocessing.Queue()p=......
  • 无法在 Jenkins 上使用来自不同文件夹/Poetry 环境的导入
    Poetry和Jenkins问题:无法使用来自不同文件夹/Poetry环境的导入大家好,我当前的设置遇到了涉及Poetry和Jenkins的问题。我正在尝试在我的脚本中实现Poetry并在Jenkins上运行它们,到目前为止还没有成功(第一次使用Poetry)。目录结构这是我的目录结构的简......
  • PHP中static的使用
    本文由ChatMoney团队出品PHP,作为一种面向对象的编程语言,为开发者提供了丰富的特性和功能,助力构建高效的应用程序。其中,static关键字在类和方法中的应用尤为重要,它提供了一种独特的变量和方法访问机制。本文将深入探讨static关键字的使用方法,并通过具体代码示例来指导实践。一......
  • 使用ControllerAdvice定义了全局异常处理器但返回不生效
    @Slf4j@ControllerAdvicepublicclassGlobalExceptionHandler{ @ExceptionHandler(Exception.class) publicAjaxResultexception(Exceptionexception){ log.error("exception:{}",exception.getMessage()); returnAjaxResult.error(exception.getMe......