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资源概念,不配置spring.cloud.sentinel.eager=true参数,@RequestMapping不会别识别,懒加载模式

二、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

posted @ 2020-09-29 12:33  albert飞的博客  阅读(1983)  评论(0编辑  收藏  举报