第一章:【入门】

1、介绍

英文官网     https://github.com/alibaba/Sentinel
中文官网      https://github.com/alibaba/Sentinel/wiki/%E4%BB%8B%E7%BB%8D

Sentinel是什么?
(熔断、降级、限流)Spring Cloud Sentinel 是分布式系统的流量控制组件,可实现流量控制、熔断降级、系统负载保护等,保障服务稳定性。
去哪下? https://github.com/alibaba/Sentinel/releases
与hystrix对比
在这里插入图片描述

2、安装Sentinel控制台

(略过,参考安装笔记)

第二章:【流控规则】

- 资源名:唯一名称,默认请求路径
- 针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)
- 阈值类型/单机阈值:
- QPS(每秒钟的请求数量):当调用该api的QPS达到阈值的时候,进行限流
- 线程数:当调用该api的线程数达到阈值的时候,进行限流
- 是否集群:不需要集群
- 流控模式:
- 直接:api达到限流条件时,直接限流
- 关联:当关联的资源达到阈值时,就限流自己
- 链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】
流控效果:
- 快速失败:直接失败,抛异常
- Warm Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值
- 排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效

1、[流控模式]—直接、关联、链路

【关联例子】
当B接口达到阈值,A接口限流。例如:支付接口B到阈值快顶不住了,限制下单A接口。
可自行测试。大批量线程高并发访问B,导致A失效了!!
在这里插入图片描述

【链路例子】
根据上游来源的路径做限制。
在这里插入图片描述

2、 [流控效果]—快速失败、预热、排队

在这里插入图片描述

快速失败(默认的流控处理)
直接失败,抛出异常 Blocked by Sentinel (flow limiting)
Warmup预热
公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值
限流 冷启动

在这里插入图片描述

单机赋值10,预热5秒=====意思是低流量时候,突然来大流量,此时5秒内只能让10/3=3 个成功,5秒后才能达到10个。
应用场景
秒杀场景,一开抢,可能会系统崩溃,先预热。

排队等待
匀速排队,阈值必须设置为QPS,超过了会让队列里,挨个迅速通过,等待超过时间就返回错误
在这里插入图片描述

第三章:【熔断降级规则】

熔断是什么?类似于电路中的保险丝,到达阈值会跳闸一段时间,然后再恢复
熔断策略有【慢调用比例】【异常比例】【异常数】配置

1、[慢调用比例]

在这里插入图片描述

以上配置的说明:
在每 1 秒的统计周期内,如果响应时间超过 200 毫秒的请求占比达到 50% 且请求数量不少于 5 个,则触发熔断,熔断时长为 10 秒。
这样可以有效防止该资源因慢调用导致系统性能下降或崩溃。

2、[异常比例]

在这里插入图片描述

以上配置的说明:
统计一秒内的请求,数量大于5且异常比例超过50% ,则触发熔断,该资源在接下来的 10 秒内不再接受请求。

1、[异常数]

在这里插入图片描述

以上配置的说明:
统计一秒内的请求,请求数量大于10且异常数超过3个 ,则触发熔断,该资源在接下来的 10 秒内不再接受请求。

第四章:【热key限流】

可以针对对接口的参数进行设置,如发送短信,key为手机号,一分钟内只能发送一次,防止恶意多发。

@GetMapping("/sendSms")
@SentinelResource(value = "sentinelSendSms",blockHandler = "sendSmsHandler")
public String testHotKey(@RequestParam(value = "phone",required = false) String phone,
                         @RequestParam(value = "name",required = false) String name) {
    //int age = 10/0;
    return "------testHotKey";
}
//兜底方法
public String sendSmsHandler (String phone, String name, BlockException exception){
    return "------deal_testHotKey,o(╥﹏╥)o";  
}

配置如下:
根据参数手机号(下标为0),限制60秒内只能请求一次,多的执行兜底。
在这里插入图片描述

第五章:【系统规则】

系统规则:系统级别的,比如系统到达配置的qps 20万, 触发默认堵塞处理器。
在这里插入图片描述

在这里插入图片描述

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.system.SystemBlockException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;

@ControllerAdvice
public class CustomSentinelBlockHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws Exception {
        // 区分异常类型(系统规则触发的是SystemBlockException)
        String msg;
        int code = 500;
        if (e instanceof SystemBlockException) {
            msg = "系统资源紧张,请稍后再试(触发系统规则保护)";
            code = 10001; // 自定义业务错误码
        } else {
            msg = "请求被限流,请稍后再试";
            code = 10002;
        }

        // 返回JSON格式响应
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().write("{\"code\":" + code + ",\"msg\":\"" + msg + "\",\"data\":null}");
    }
}

第六章:【持久化】

一旦我们重启应用,Sentinel规则将消失,生产环境需要将配置规则进行持久化
实现:服务配置并连接到nacos做持久化,配置规则到json里。(引入相关nacos依赖)

<!-- Sentinel 集成 Nacos 数据源的关键依赖(必须添加) -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <!-- 版本需与Sentinel核心依赖版本一致,如1.8.6 -->
</dependency>

配置:略过其他配置只显示要添加的配置。

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel 控制台 地址
        port: 8719
      datasource: #持久化配置
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: cloudalibaba-sentinel-service
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow
 

添加Nacos业务规则配置(配置列表–新建配置)
在这里插入图片描述

添加内容

[
    {
         "resource": "/retaLimit/byUrl",// 资源名称
         "limitApp": "default",// 来源应用
         "grade":   1,// 阈值类型,0表示线程数,1表示QPS;
         "count":   1,// 单机阈值;
         "strategy": 0,// 流控模式,0表示直接,1表示关联,2表示链路;
         "controlBehavior": 0,// 流控效果,0表示快速失败,1表示Warm Up,2表示排队等待;
         "clusterMode": false    // 是否集群
    }
]

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

重启服务,就会出现(持久化的)
在这里插入图片描述

Logo

网易智企-云信开发者社区是面向全网开发者的技术交流与服务平台,依托近 29 年 IM、音视频技术积累,提供 IM、RTC、实时对话智能体、云原生、短信等全场景开发资源。

更多推荐