• Sentinel基础应用


    Sentinel 是什么?

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

    Sentinel 具有以下特征:

    • 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
    • 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。
    • 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。
    • 完善的 SPI 扩展机制:Sentinel提供简单易用、完善的SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。

    Setinel的主要特性:

    Setinel分为两个部分:

    • 核心库(Java客户端)不依赖任何框架/库,能够运行于所有Java运行时环境,同时对Dubbo/Spring Cloud等框架也有较好的支持。
    • 控制台(Dashboard)基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。

    快速开始

    1. Sentinel Dashboard部署,下载地址:https://github.com/alibaba/Sentinel/releases ,使用命令启动
    java -jar sentinel-dashboard-1.8.3.jar
    
    1. 登录控制台,地址: http://localhost:8080 初始账密:sentinel/sentinel

    2. 引入依赖

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    
    1. 在服务的application.properties中加入以下配置
    spring:
      application:
        name: resume-nacos-consumer
      cloud:
       sentinel:
              transport:
                dashboard: 127.0.0.1:8080
                port: 8719  #sentinel会在该端口启动http server,那么这样的话,控制台定义的一些限流等规则才能发送传递过来
    

    然后调用接口,再查看Sentinel控制台(注意有一会儿的延迟)。

    Sentinel关键概念

    概念名称 概念描述
    资源 它可以是Java应⽤程序中的任何内容。例如,由应⽤程序提供的服务或由应⽤程序调⽤的其它应⽤提供的服务,甚⾄可以是⼀段代码。我们请求的API接⼝就是资源
    规则 围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整

    流控实战

    • 资源名:默认请求的路径
    • 针对来源:可以填写微服务名称,Sentinel支持针对调用者进行限流。默认是default(不区分来源)
    • 阈值类型:QPS和线程数
    • 流控模式:
      • 直接:资源调⽤达到限流条件时,直接限流
      • 关联:填写一个关联资源,关联的资源达到阈值了,也限流自己这个资源(资源名处配置的资源)
      • 链路:如果有多个链路都可以调用到本资源,可以指定只记录某个链路上的流量
    • 流控效果:
      • 快速失败:直接失败,抛出异常
      • Warm Up:根据冷加载因子(默认3)的值,从(阈值/冷加载因子)经过预热时长后才能达到设置的QPS阈值。因为有时系统没预热的时候它的QPS达不到那么高,所以最开始不能放那么高的阈值的流量进来。
      • 排队等待:多余请求匀速排队,让请求匀速通过,阈值类型必须设置为QPS,否则无效。

    降级实战

    Sentinel降级会在调⽤链路中某个资源出现不稳定状态时(例如调⽤超时或异常⽐例升⾼),对这个资源的调⽤进⾏限制,让请求快速失败,避免影响到其它的资源⽽导致级联错误。当资源被降级后,在接下来的降级时间窗⼝之内,对该资源的调⽤都⾃动熔断

    慢调用比例:

    • 最大RT:代表设定一个时间,超过这个时间就认定为慢响应
    • 比例阈值:超过多少比例进入熔断
    • 熔断时长
    • 最小请求数:超过最小请求数才能生效

    这个版本下好像有bug,比例阈值填不了

    异常比例:

    异常比例超过0.5就会熔断

    异常数:

    异常数超过2就会被熔断,上面熔断后,会直接抛出异常。像下面这样:

    实际应用中,我们需要对异常进行自定义。

    3.1 自定义降级异常

    使用blockHandler:

    @RequestMapping("/testException")
        @SentinelResource(value = "/testExceptionTest",blockHandlerClass = SentinelFallback.class,blockHandler = "handleException")
        public String testException(){
            int i=1/0;
            return "ok";
        }
    
    public class SentinelFallback {
    
        /**
         * 形参最后加入BlockException参数,用于接收异常,方法必须为public static
         * @param blockException
         * @return
         */
        public static String handleException(BlockException blockException){
            return "exception";
        }
    }
    

    使用fallback:

    @RequestMapping("/testError")
        @SentinelResource(value = "/testErrorTest",fallbackClass = SentinelFallback.class,fallback = "handleError")
        public String testError(){
            int i=1/0;
            return "ok";
        }
    
    public class SentinelFallback {
    
        //方法列表需要和原函数一致,或者多一个Throwable类型的参数
        public static String handleError(){
            return "error";
        }
    }
    

    fallback和blockHandler的区别:fallback可以处理所有类型的异常,而blockHandler只处理BlockException类型的异常。

    3.2 基于Nacos实现Sentinel规则持久化

    1. 引入依赖
     <!-- Sentinel支持采用Nacos作为规则配置数据源 -->
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-datasource-nacos</artifactId>
    </dependency>
    
    1. sentinel中配置Nacos数据源
    spring:
      application:
        name: resume-nacos-consumer
      cloud:
          sentinel:
            transport:
              dashboard: 127.0.0.1:8080
              port: 8719  #sentinel会在该端口启动http server,那么这样的话,控制台定义的一些限流等规则才能发送传递过来
            datasource:
              flow:  # 名称是自定义的
                nacos:
                  server-addr: ${spring.cloud.nacos.discovery.server-addr}
                  data-id: ${spring.application.name}-flow-rules
                  groupId: DEFAULT_GROUP
                  data-type: json
                  rule-type: flow  # 类型来⾃RuleType类
              degrade:  # 名称是自定义的
                nacos:
                  server-addr: ${spring.cloud.nacos.discovery.server-addr}
                  data-id: ${spring.application.name}-degrade-rules
                  groupId: DEFAULT_GROUP
                  data-type: json
                  rule-type: degrade  # 类型来⾃RuleType类
    
    1. 在Nacos里面进行配置

    配置完后我们发现Sentinel里面就有了

    1. 配置说明

    所有属性来⾃源码FlowRule类

    • resource:资源名称
    • limitApp:来源应⽤
    • grade:阈值类型 0 线程数 1 QPS
    • count:单机阈值
    • strategy:流控模式,0 直接 1 关联 2 链路
    • controlBehavior:流控效果,0 快速失败 1 Warm Up 2 排队等待
    • clusterMode:true/false 是否集群

    降级配置规则:

    配置文件: resume-nacos-consumer-degrade-rules

    [
    {
    "resource":"findResumeOpenState",
    "grade":2,
    "count":1,
    "timeWindow":5
    }
    ]
    

    所有属性来⾃源码DegradeRule类

    • resource:资源名称
    • grade:降级策略 0 RT 1 异常⽐例 2 异常数
    • count:阈值
    • timeWindow:时间窗

    注意

    1. ⼀个资源可以同时有多个限流规则和降级规则,所以配置的数据是⼀个json数组
    2. Sentinel控制台中修改规则,仅是内存中⽣效,不会修改Nacos中的配置值,重启后恢复原来的值;而在Nacos控制台中修改规则,不仅内存中⽣效,Nacos中持久化规则也⽣效,重启后规则依然保持。
  • 相关阅读:
    SPOJ 694 (后缀数组) Distinct Substrings
    POJ 2774 (后缀数组 最长公共字串) Long Long Message
    POJ 3693 (后缀数组) Maximum repetition substring
    POJ 3261 (后缀数组 二分) Milk Patterns
    UVa 1149 (贪心) Bin Packing
    UVa 12206 (字符串哈希) Stammering Aliens
    UVa 11210 (DFS) Chinese Mahjong
    UVa (BFS) The Monocycle
    UVa 11624 (BFS) Fire!
    HDU 3032 (Nim博弈变形) Nim or not Nim?
  • 原文地址:https://www.cnblogs.com/javammc/p/16152208.html
Copyright © 2020-2023  润新知