• SpringCloudAlibaba之Sentinel流量控制


    SpringCloudAlibaba微服务实战教程系列  

    一、认识下Sentinel

       Sentinel使用流程:微服务会集成Sentinel客户端,从官方下载jar启动作为服务端,在有配置变更和添加的时候Sentinel会发送消息给客户端,进行变更应用。

     Sentinel 分为两个部分:

    核⼼库:(Java 客户端)不依赖任何框架/库,能够运⾏于所有 Java 运⾏时环境,同时对 Dubbo /Spring Cloud 等框架也有较好的⽀持。
    控制台:(Dashboard)基于 Spring Boot 开发,打包后可以直接运⾏,不需要额外的 Tomcat 等应⽤容器。
    Sentinel 具有以下特征:
    丰富的应⽤场景:Sentinel 承接了阿⾥巴巴近 10 年的双⼗⼀⼤促流量的核⼼场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填⾕、集群流量控制、实时熔断下游不可⽤应⽤等。
    完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接⼊应⽤的单台机器秒级数据,甚⾄ 500 台以下规模的集群的汇总运⾏情况。
    ⼴泛的开源⽣态:Sentinel 提供开箱即⽤的与其它开源框架/库的整合模块,例如与 SpringCloud、Dubbo的整合。您只需要引⼊相应的依赖并进⾏简单的配置即可快速地接⼊ Sentinel。
    完善的 SPI 扩展点:Sentinel 提供简单易⽤、完善的 SPI 扩展接⼝。您可以通过实现扩展接⼝来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

    二、Sentinel简单实战 

      Sentinel官方版本下载地址: https://github.com/alibaba/Sentinel/releases 

    快速下载启动开发环境:国内朋友可以考虑使用docker配置国内镜像源
    直接执行:docker run --name sentinel -p 8858:8858 -d  bladex/sentinel-dashboard

      1、搭建Sentinel服务端

        如下下载的jar包直接执行以下命令即可启动服务。

     java -jar sentinel-dashboard-1.7.1.jar &

         jar命令启动完成,登录地址 http://localhost:8080,  ⽤户名/密码:sentinel/sentinel

         docker启动完成,登录地址 http://localhost:8858,  ⽤户名/密码:sentinel/sentinel

      2、搭建Sentinel客户端

       第一步、先引入pom文件,注意没有使用maven统一管理版本号的,需要指定version字段

            <!--借用监控开放端口-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            <!--sentinel 核⼼环境 依赖-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            </dependency>

       第二步、修改配置文件

        注意:dashboard 为sentinel服务的客户端,port为客户端自己开发端口,用于接收服务端发送的限流数据,port可以随意更改。

    spring:
        sentinel:
          transport:
            #sentinel dashboard/console 地址
            dashboard: 127.0.0.1:8858
            # sentinel会在该端⼝启动http server,那么这样的话,控制台定义的⼀些限流等规则才能发送传递过来,
            port: 8719
    
    #暴露出来健康检查和检测的接口
    management:
      endpoints:
        web:
          exposure:
            include: "*"
      endpoint:
        health:
          show-details: always

        第三步、启动项目访问Sentenl即可生效

    三、Sentinel高级应用

      1、流控规则

        在Sentinel服务的管理台,会列出服务的菜单,点击服务-->簇点链路-->流控,出现下图页面。 

     重点属性介绍

    资源名:
      默认请求路径
    针对来源:
      Sentinel可以针对调⽤者进⾏限流,填写微服务名称,默认default(不区分来源)
    阈值类型/单机阈值
      QPS:(每秒钟请求数量)当调⽤该资源的QPS达到阈值时进⾏限流
      线程数:当调⽤该资源的线程数达到阈值的时候进⾏限流(线程处理请求的时候,如果说业务逻辑执⾏时间很⻓,流量洪峰来临时,会耗费很多线程资源,这些线程资源会堆积,最终可能造成服务不可⽤,进⼀步上游服务不可⽤,最终可能服务雪崩)
    是否集群:
      是否集群限流
    流控模式:
      直接:资源调⽤达到限流条件时,直接限流
      关联:关联的资源调⽤达到阈值时候限流⾃⼰
      链路:只记录指定链路上的流量
    流控效果:
      快速失败:直接失败,抛出异常
      Warm Up:根据冷加载因⼦(默认3)的值,从阈值/冷加载因⼦,经过预热时⻓,才达到设置的QPS阈值
      排队等待:匀速排队,让请求匀速通过,阈值类型必须设置为QPS,否则⽆效
      流控模式之关联限流
        关联的资源调⽤达到阈值时候限流⾃⼰,⽐如⽤户注册接⼝,需要调⽤身份证校验接⼝(往往身份证校验接⼝),如果身份证校验接⼝请求达到阈值,使⽤关联,可以对⽤户注册接⼝进⾏限流。
      流控模式之链路限流
        链路指的是请求链路(调⽤链)
        链路模式下会控制该资源所在的调⽤链路⼊⼝的流量。需要在规则中配置⼊⼝资源,即该调⽤链路⼊⼝的上下⽂名称。
      Warm Up 模式(预热模式)
        预热让通过的流量缓慢n秒内增加,经过设置的预热时间以后,到达系统处理请求速率的设定值。Warm Up 模式默认会从设置的 QPS 阈值的 1/3 开始慢慢往上增加⾄ QPS 设置值。
      流控效果之排队等待
        排队等待模式下会严格控制请求通过的间隔时间,即请求会匀速通过,允许部分请求排队等待,通常⽤于消息队列削峰填⾕等场景。需设置具体的超时时间,当计算的等待时间超过超时时间时请求就会被拒绝。 

      2、Sentinel 降级规则模块

    RT(平均响应时间 )
      当 1s 内持续进⼊ >=5 个请求,平均响应时间超过阈值(RT以 ms 为单位),那么在接下的时间窗⼝(以 s 为单位)之内,对这个⽅法的调⽤都会⾃动地熔断(抛出 DegradeException)。注意Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。
    异常⽐例
      当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的⽐值超过阈值之后,资源进⼊降级状态,即在接下的时间窗⼝(以 s 为单位)之内,对这个⽅法的调⽤都会⾃动地返回。异常⽐率的阈值范围是 [0.0, 1.0] ,代表 0% - 100%。
    异常数
      当资源近 1 分钟的异常数⽬超过阈值之后会进⾏熔断。注意由于统计时间窗⼝是分钟级别的,若timeWindow ⼩于 60s,则结束熔断状态后仍可能再进⼊熔断状态。

      3、Sentinel ⾃定义兜底逻辑

        注意:兜底⽅法非本类需要为static静态⽅法,同时指定资源类,可以为当前类的非静态方法,blockHandler保持返回值与参数一致的同时在添加com.alibaba.csp.sentinel.slots.block.BlockException类型的参数,用于接收sentinel异常,fallback方法为java异常返回方法

         @SentinelResource注解类似于Hystrix中的@HystrixCommand注解

        @SentinelResource注解中有两个属性需要我们进⾏区分,blockHandler属性⽤来指定不满⾜Sentinel规则的降级兜底⽅法,fallback属性⽤于指定Java运⾏时异常兜底⽅法
    @SentinelResource 注解常用属性
      value:定义资源名唯一或共享(针对接口级别线程池)
      blockHandlerClass:指定Sentinel规则异常兜底逻辑所在class类
      blockHandler:指定Sentinel规则异常兜底逻辑具体哪个⽅法
      fallbackClass:指定Java运⾏时异常兜底逻辑所在class类
      fallback:指定Java运⾏时异常兜底逻辑具体哪个⽅法

    sentinel对接nacos持久话配置 

    https://www.jianshu.com/p/d36f55ef2688?utm_campaign=haruki

  • 相关阅读:
    AcWing 1027. 方格取数 dp
    AcWing 1014. 登山 dp
    acwing 482. 合唱队形 dp
    LeetCode 1463. 摘樱桃II dp
    LeetCode 100. 相同的树 树的遍历
    LeetCode 336. 回文对 哈希
    LeetCode 815. 公交路线 最短路 哈希
    算法问题实战策略 DARPA大挑战 二分
    算法问题实战策略 LUNCHBOX 贪心
    AcWing 1100. 抓住那头牛 BFS
  • 原文地址:https://www.cnblogs.com/niunafei/p/13746424.html
Copyright © 2020-2023  润新知