Alibaba Sentinel

Alibaba Sentinel

本文sentinel版本 : 1.8.1

详细文档: https://github.com/alibaba/Sentinel/wiki


官网下载地址 : https://github.com/alibaba/Sentinel/releases

1. 准备工作

  1. 下载sentinel(jar包)

  2. 启动sentinel

java -jar sentinel-dashboard-1.8.1.jar
  1. 浏览器访问localhost:8080访问sentinel控制台, 访问成功即sentinel启动成功

  2. 代码添加依赖

      <dependency>
      		<groupId>com.alibaba.cloud</groupId>
      		<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
      </dependency>
      <dependency>
        	<groupId>org.springframework.boot</groupId>
        	<artifactId>spring-boot-starter-actuator</artifactId>
      </dependency>
    
  3. 配置文件

    server:
      port: 9080
    spring:
      application:
        name: demo-sentinel-service
      cloud:
        nacos:
          discovery:
            # Nacos服务注册中心地址
            server-addr: localhost:8848
        sentinel:
          transport:
            dashboard: localhost:8080
            # 默认为8719,如果被占用会自动+1,直到找到为止
            port: 8719
      endpoints:
        web:
          exposure:
            include: "*"
    
  4. 启动项目

    1. 访问sentinel控制台, 发现一点动静没有, 因为sentinel默认懒加载, 在代码中写个controller, 访问几次在控制台即可看到监控成功

2. 控制台内容

2.1 实时监控

​ 同时,同一个服务下的所有机器的簇点信息会被汇总,并且秒级地展示在"实时监控"下。

注意: 实时监控仅存储 5 分钟以内的数据,如果需要持久化,需要通过调用实时监控接口来定制。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jHndu0Lh-1619519098630)(/Users/maple/Library/Application Support/typora-user-images/image-20210426213023833.png)]

2.2 簇点链路

​ "簇点链路"中显示刚刚调用的资源

2.3 流控规则

​ 两种添加方式:

​ 在簇点链路中选择链路添加流控方式

​ 在流控规则中添加流控规则, 绑定资源名

2.3.1 流控模式:
  1. 控制台配置流控规则, 有QPS和线程数的流控方式

    在这里插入图片描述

    达到流控规则后页面返回系统默认流控信息

    Blocked by Sentinel (flow limiting)
    
  2. 关联

    A, B两个接口, 设置A的流控规则为关联, 并且关联资源B, 假设B已经设置好流控规则, 并且达到了流控条件, 即A会降级(B闯祸, A买单)

2.3.2 流控效果:
  • 默认快速失败 - Blocked by Sentinel (flow limiting)

  • Warm Up(预热) 冷加载因子固定是3. 假设配置的QPS是12, 预热时长设置的是5, 在前5s实际QPS峰值是4(12/3), 这5s内访问QPS超过4会限流, 这5s之后QPS会达到初始设定的12

  • 排队等待 让请求以均匀方式通过, 对应漏桶算法, 阈值类型必须是QPS, 线程数无该选项, 设置QPS和超时时间, 超过最大等待时间即限流 适用于消息队列, 不会在一开始拒绝多余的请求. 希望达到的效果(即没有让服务崩掉, 又没有拒绝请求)

2.4 降级规则

  • 慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

  • 异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

  • 异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

2.5 热点规则(QPS限流)

  1. 代码中在controller上添加如下代码, value=资源名, blockHandler=降级方法

    @SentinelResource(value = "resourceName",blockHandler = "fallbackMethod")
    
  2. 在该controller下面编写fallbackMethod, 加上BlockException参数

    public String fallbackMethod(String param, BlockException exception){
            return "test_fallback";
        }
    
  3. 在热点规则中添加规则, 按照参数下标来定义第几个参数

  4. 达到限流条件后会执行fallbackMethod

参数例外项

​ 条件: 被限流的参数, 希望遇到一些特定值, 有自己的特定限流规则, 自己的QPS限流方式

if(热点规则限流) {
  if (参数值 == 例外项A) {
    do A例外项的限流规则
  }
  if (参数值 == 例外B) {
    do B例外项的限流规则
  }....
  do 常规限流规则
}

2.6 系统规则

  • Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps * minRt 估算得出。设定参考值一般是 CPU cores * 2.5
  • CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
  • 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
  • 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

2.7 授权规则

  • 配置资源名
  • 流控应用填写调用方应用名

2.8 sentinel持久化机制(持久化到nacos)

​ 以上的控制台操作都会随着服务的停止而消失.

  • 需要添加持久化规则的项目pom添加依赖

      <dependency>
          <groupId>com.alibaba.csp</groupId>
          <artifactId>sentinel-datasource-nacos</artifactId>
      </dependency>
    
  • 配置文件添加持久化配置

    spring:
      application:
        name: demo-sentine
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848
        sentinel:
          transport:
            dashboard: localhost:8080
            # 默认为8719,如果被占用会自动+1,直到找到为止
            port: 8719
          # 流控规则持久化到nacos
          datasource:
            dsl:
              nacos:
                server-addr: localhost:8848
                data-id: ${spring.application.name}
                group-id: DEFAULT_GROUP
                data-type: json
                rule-type: flow
    
  • 编写json文件

    [
        {
            "resurce":"/demo",       	资源名称
            "limitApp":"default",			来源应用
            "grade":1,								阈值类型: 0: 线程数, 1: QPS
            "count":1,								单机阈值
            "strategy":0,							流控模式: 0: 直接, 1: 关联, 2: 链路
            "controlBehavior":0,			流控效果: 0: 快速失败, 1: Warm Up预热, 2: 排队等待
            "clusterMode":false				是否集群
        }
    ]
    
  • Nacos添加配置文件

    • dataId: ${spring.application.name} 服务名称
    • group: 分组

感觉这一版sentinel持久化没有锤子用 !!!, 期待后面可以直接在sentinel中配置持久化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sentinel 是一款开源的分布式系统防护组件,主要用于服务的流量控制、熔断降级和系统负载保护等。Sentinel 提供了一种基于注解和 API 的自定义限流方式。 自定义限流的主要步骤如下: 1. 定义资源名:在 Sentinel 中,资源是需要受到限流保护的对象。可以使用 `@SentinelResource` 注解来定义资源名。 ```java @SentinelResource(value = "myResource", blockHandler = "handleBlock") public void myMethod() { // 方法逻辑 } // 定义限流规则 private void handleBlock(BlockException ex) { // 处理限流逻辑 } ``` 2. 配置限流规则:通过 Sentinel Dashboard 或者代码方式配置限流规则,即设置每个资源的 QPS 阈值、流控模式等。 3. 触发限流:当资源的访问量超过限流规则中的阈值时,Sentinel 会触发限流,执行 blockHandler 中定义的逻辑。 以上是基于注解的方式,如果希望基于 API 进行自定义限流,可以使用 Sentinel 提供的 `SphU` 和 `Tracer` 等类进行手动埋点和统计。例如: ```java // 定义资源名 String resourceName = "myResource"; // 手动埋点 Entry entry = null; try { entry = SphU.entry(resourceName); // 执行业务逻辑 } catch (BlockException ex) { // 处理限流逻辑 } finally { if (entry != null) { entry.exit(); } } // 手动统计指标 Tracer.traceCount(resourceName, 1); ``` 通过自定义限流,可以灵活地根据业务需要对不同的资源进行限流保护,提高系统的可靠性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值