Sentinel

本文详细介绍了阿里巴巴Sentinel框架的整合、使用方法,包括流量控制规则、熔断降级、系统保护、访问控制、热点规则,以及如何集成控制台和与其他技术(如SpringCloud、RestTemplate和Feign)的整合,还涵盖了规则持久化的相关内容。
摘要由CSDN通过智能技术生成

一、整合:加依赖

        <!-- 服务容错 -->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-core</artifactId>
        </dependency>

二、如何使用:如何使用 · alibaba/Sentinel Wiki · GitHub

        2.1、流量控制规则

Field说明默认值
resource资源名,资源名是限流规则的作用对象
count限流阈值
grade限流阈值类型,QPS 模式(1)或并发线程数模式(0)QPS 模式
limitApp流控针对的调用来源default,代表不区分调用来源
strategy调用关系限流策略:直接、链路、关联根据资源本身(直接)
controlBehavior流控效果(直接拒绝/WarmUp/匀速+排队等待),不支持按调用关系限流直接拒绝
clusterMode是否集群限流

        2.2、熔断降级规则

Field说明默认值
resource资源名,即规则的作用对象
grade熔断策略,支持慢调用比例/异常比例/异常数策略慢调用比例
count慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值
timeWindow熔断时长,单位为 s
minRequestAmount熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入)5
statIntervalMs统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入)1000 ms
slowRatioThreshold慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)

         2.3、系统保护规则

Field说明默认值
highestSystemLoadload1 触发值,用于触发自适应控制阶段-1 (不生效)
avgRt所有入口流量的平均响应时间-1 (不生效)
maxThread入口流量的最大并发数-1 (不生效)
qps所有入口资源的 QPS-1 (不生效)
highestCpuUsage当前系统的 CPU 使用率(0.0-1.0)-1 (不生效)

        2.4、访问控制规则

  • resource:资源名,即限流规则的作用对象。
  • limitApp:对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB
  • strategy:限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式。

        2.5、热点规则

属性说明默认值
resource资源名,必填
count限流阈值,必填
grade限流模式QPS 模式
durationInSec统计窗口时间长度(单位为秒),1.6.0 版本开始支持1s
controlBehavior流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持快速失败
maxQueueingTimeMs最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持0ms
paramIdx热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置
paramFlowItemList参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型
clusterMode是否是集群参数流控规则false
clusterConfig集群流控相关配置

 三、集成控制台

        3.1、搭建

        下载控制台:https://github.com/alibaba/sentinel/releases

        启动:java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar

        3.2、应用整合

        依赖

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-transport-simple-http</artifactId>
        </dependency>

        配置

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080

        3.3、访问控制台:http://localhost:8080/#/login,sentinel/sentinel

四、Sentinel API

        4.1、流控

        4.2、熔断

        4.3、示例

    @GetMapping("/testSentinelApi")
    public String testSentinelApi(@RequestParam(required = false)String a){
        String resource = "test-sentinel-api";
        String origin = "demo";
        ContextUtil.enter(resource, origin);

        Entry entry = null;
        try {
            entry = SphU.entry(resource);

            if(StringUtils.isBlank(a)){
                throw new IllegalAccessException("a不能为空!");
            }
            return a;

        } catch (BlockException e){
            log.warn("限流,或者降级了", e);
            return "限流,或者降级了";
        }catch (IllegalAccessException e2){
            Tracer.trace(e2);
            return "参数非法!";
        } finally {
            if(entry != null){
                entry.exit();
            }
            ContextUtil.exit();
        }
    }

五、@SentinelResource

        5.1、引入依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
</dependency>

        5.2、注解详解

属性作用是否必须
value资源名称
entryTypeentry类型,标记流量的方向,取值IN/OUT,默认是OUT
blockHandler处理BlockException的函数名称。函数要求:
1. 必须是 public
2.返回类型与原方法一致
3. 参数类型需要和原方法相匹配,并在最后加 BlockException 类型的参数
4. 默认需和原方法在同一个类中。若希望使用其他类的函数,可配置 blockHandlerClass ,并指定blockHandlerClass里面的方法。
blockHandlerClass存放blockHandler的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同blockHandler。
fallback用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。函数要求:
1. 返回类型与原方法一致
2. 参数类型需要和原方法相匹配,Sentinel 1.6开始,也可在方法最后加 Throwable 类型的参数。
3.默认需和原方法在同一个类中。若希望使用其他类的函数,可配置 fallbackClass ,并指定fallbackClass里面的方法。
fallbackClass【1.6】存放fallback的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同fallback。
defaultFallback【1.6】用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求:
1. 返回类型与原方法一致
2. 方法参数列表为空,或者有一个 Throwable 类型的参数。
3. 默认需要和原方法在同一个类中。若希望使用其他类的函数,可配置 fallbackClass ,并指定 fallbackClass 里面的方法。
exceptionsToIgnore【1.6】指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出。
exceptionsToTrace需要trace的异常Throwable

        5.3、示例

    @GetMapping("/testSentinelResource")
    @SentinelResource(
            value = "test-sentinel-api",
            blockHandler = "block",
            blockHandlerClass = {DemoBlockHandler.class},
            fallback = "fallback",
            fallbackClass = {DemoFallback.class}
    )
    public String testSentinelResource(@RequestParam(required = false)String a) throws Exception {
        if(StringUtils.isBlank(a)){
            throw new IllegalAccessException("a不能为空!");
        }
        return a;
    }

@Slf4j
public class DemoBlockHandler {

    public static String block(String a, BlockException e){
        log.warn("限流、或者降级了 block ", e);
        return "限流、或者降级了 block ";
    }

}

@Slf4j
public class DemoFallback {

    public static String block(String a, BlockException e){
        log.warn("限流、或者降级了 block ", e);
        return "限流、或者降级了 block ";
    }

}

六、RestTemplate整合Sentinel

        6.1、启动类加注解

    @LoadBalanced
    @Bean
    @SentinelRestTemplate
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

        6.2、打开开关

resttemplate:
  sentinel:
    enabled: true

七、Feign整合Sentinel

        7.1修改配置

spring:
  cloud:
    openfeign:
      sentinel:
        enable: true

        7.2、定制自己的处理逻辑:@FeignCliet(fallback=)

        7.3、获取异常:@FeignClient(fallbackFactory=)

八、规则持久化

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值