• 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

  • 相关阅读:
    request和request.form和request.querystring的区别
    PL/SQL Developer连接64位Oracle
    C# Winform控件对透明图片重叠时导致图片不透明的解决方法
    C++11多线程编程-两个进程轮流打印1~100
    使用 C++11 并发编程入门
    STL vector动态扩容
    GDB入门教程
    统计整数中1的个数
    gulp的使用
    nvm安装教程
  • 原文地址:https://www.cnblogs.com/niunafei/p/13746424.html
Copyright © 2020-2023  润新知