SpringCloudAlibaba 服务保护 Sentinel 项目集成实践

目录

    • 一、简介
      • 1.1、服务保护的基本概念
        • 1.1.1、服务限流/熔断
        • 1.1.2、服务降级
        • 1.1.3、服务的雪崩效应
        • 1.1.4、服务的隔离的机制
      • 1.2、Sentinel的主要特性
      • 1.3、Sentinel整体架构
      • 1.4、Sentinel 与 Hystrix 对比
    • 二、Sentinel控制台部署
      • 3.1、版本选择和适配
      • 3.2、本文使用各组件版本
      • 3.3、官方推荐版本
      • 3.4、部署Sentinel控制台
        • 3.4.1、下载 sentinel-dashboard jar包
        • 3.4.2、启动 sentinel-dashboard
    • 三、项目集成 Sentinel 实现简单流控
      • 3.1、项目中添加 Sentinel 集成包
      • 3.2、简单集成(不使用Sentinel控制台配置)
        • 3.2.1、添加流控规则
        • 3.2.2、使用 3.2.1 加载的流控规则
          • 3.2.2.1、硬编码使用流控规则
          • 3.2.2.2、使用@SentinelResource指定流控规则
      • 3.3、集成 Sentinel 控制台实现流控规则动态配置
        • 3.3.1、添加Sentinel控制台连接配置
        • 3.3.2、通过控制台添加新流控规则测试效果
          • 3.3.2.1、先准备一个接口(这个接口只简单返回一个字符串)
          • 3.3.2.2、控制台添加流控规则
          • 3.3.2.3、测试流控效果
    • 四、项目整合 Nacos 实现 Sentinel 规则持久化
      • 4.1、添加 Sentinel 集成 Nacos 包
      • 4.2、Nacos配置中心创建我们的流控规则(kerwin-user-flow-rules)
      • 4.3、配置文件配置加载Nacos配置中心流控规则json
      • 4.4、验证配置是否有效
    • 五、常用规则配置JSON解析以及加载
      • 5.1、流量控制规则(FlowRule)
        • 5.1.1、配置流控规则JSON
        • 5.1.2、配置文件配置加载Nacos配置中心流控规则json
      • 5.2、熔断降级规则(DegradeRule)
        • 5.2.1、配置熔断降级规则JSON
        • 5.2.2、配置文件配置加载Nacos配置中心熔断降级规则json
      • 5.3、热点参数规则(ParamFlowRule)
        • 5.3.1、配置熔断降级规则JSON
        • 5.3.2、配置文件配置加载Nacos配置中心熔断降级规则json
      • 5.4、系统保护规则(SystemRule)
        • 5.4.1、配置熔断降级规则JSON
        • 5.4.2、配置文件配置加载Nacos配置中心熔断降级规则json
    • 六、Sentinel 规则触发响应信息统一处理

一、简介

      SentinelSpringCloud Alibaba 家族的服务保护组件,很多项目在前中期没有遇到流量突增不太注意服务保护的重要性,当流量突增打爆应用服务或数据库时束手无策,可以不配置流控规则,但是需要时一定可以热加载使用,本文会对集成Sentinel以及动态拉取Nacos配置规则实现热加载流控规则进行讲解。

官网地址

1.1、服务保护的基本概念

1.1.1、服务限流/熔断
  • 服务限流目的是为了更好的保护我们的服务,在高并发的情况下,如果客户端请求的数量达到一定极限(后台可以配置阈值),请求的数量超出了设置的阈值,开启自我的保护,直接调用我们的服务降级的方法,不会执行业务逻辑操作,直接走本地falback的方法,返回一个友好的提示。
1.1.2、服务降级
  • 在高并发的情况下, 防止用户一直等待,采用限流/熔断方法,使用服务降级的方式返回一个友好的提示给客户端,不会执行业务逻辑请求,直接走本地的falback的方法。
    给出一个友好提示:当前排队人数过多,稍后重试!
1.1.3、服务的雪崩效应
  • 默认的情况下,Tomcat或者是Jetty服务器只有一个线程池去处理客户端的请求,
    这样的话就是在高并发的情况下,如果客户端所有的请求都堆积到同一个服务接口上,
    那么就会产生tomcat服务器所有的线程都在处理该接口,可能会导致其他的接口无法访问。
    假设我们的tomcat线程最大的线程数量是为20,这时候客户端如果同时发送100个请求会导致有80个请求暂时无法访问,就会转圈。
1.1.4、服务的隔离的机制
  • 服务的隔离机制分为信号量和线程池隔离模式
    服务的线程池隔离机制:每个服务接口都有自己独立的线程池,互不影响,缺点就是占用cpu资源非常大。
    服务的信号量隔离机制:最多只有一定的阈值线程数处理我们的请求,超过该阈值会拒绝请求。

1.2、Sentinel的主要特性

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

1.3、Sentinel整体架构

在这里插入图片描述有特殊需要还可以将自定义规则插入调用链路中。

1.4、Sentinel 与 Hystrix 对比

SentinelHystrix
隔离策略信号量隔离线程池隔离/信号量隔离
熔断降级策略基于响应时间或失败比率基于失败比率
实时指标实现滑动窗口滑动窗口(基于 RxJava)
规则配置支持多种数据源支持多种数据源
扩展性多个扩展点插件的形式
基于注解的支持支持支持
限流基于 QPS,支持基于调用关系的限流有限的支持
流量整形支持慢启动、匀速器模式不支持
系统负载保护支持不支持
控制台开箱即用,可配置规则、查看秒级监控、机器发现等不完善
常见框架的适配Servlet、Spring Cloud、Dubbo、gRPC 等Servlet、Spring Cloud Netflix

二、Sentinel控制台部署

3.1、版本选择和适配

      使用 SpringCloud Alibaba 家族组件,要注意一下版本兼容问题,避免出现一些奇怪的问题,这里会说明本文使用的各组件版本,以及 SpringCloud Alibaba 推荐的各版本适配。

3.2、本文使用各组件版本

      部分组件对版本兼容要求其实没有那么高,比如Nacos,不一定要按照官方推荐版本,差几个小版本没有什么影响,我本地使用的一直是Nacos2.0.2,代码集成实现基本都一样。

JDK:1.8.0
Spring-Boot:2.3.12.RELEASE
Spring-Cloud:Hoxton.SR12
Spring-Cloud-Alibaba:2.2.9.RELEASE
Nacos:2.0.2
Sentinel:1.8.5

3.3、官方推荐版本

官方版本说明
在这里插入图片描述

3.4、部署Sentinel控制台

3.4.1、下载 sentinel-dashboard jar包

这里使用sentinel-dashboard-1.8.5,这里提供两个下载地址,需要其它版本可以自行去github下载,如果有条件建议直接下载sentinel-dashboard源码部署,后续需要对sentinel-dashboard源码进行改造才能进行流控规则双向同步。。
github下载地址
百度网盘地址
在这里插入图片描述

3.4.2、启动 sentinel-dashboard
java -Dserver.port=8180 -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=123456 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.5.jar
  • -Dserver.port=8180
    sentine 服务控制台端口
  • -Dsentinel.dashboard.auth.username=sentinel
    sentine 控制台登录账号,不设置默认sentinel
  • -Dsentinel.dashboard.auth.password=123456
    sentine 控制台登录密码,不设置默认sentinel
  • -Dcsp.sentinel.dashboard.server=localhost:8180
    将控制台自身注册到server
  • -Dproject.name=sentinel-dashboard
    控制台服务自己项目名称

在这里插入图片描述
在这里插入图片描述

三、项目集成 Sentinel 实现简单流控

3.1、项目中添加 Sentinel 集成包

		<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

3.2、简单集成(不使用Sentinel控制台配置)

3.2.1、添加流控规则

      流控规则是由FlowRuleManager类统一管理的,只要将规则编辑好加载到FlowRuleManager类中即可,也可以使用一个接口来添加,添加前先获取已有规则然后追加,比较简单这里不过多说明。

import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;

@Slf4j
@Configuration
public class SentinelRuleInitConfiguration {
    public final static String GETUSER_KEY = "getUserInfo";

    @PostConstruct
    public void initSentinelRule() {
        // 先从FlowRuleManager获取已有规则
        List<FlowRule> rules = FlowRuleManager.getRules();
        // 判断FlowRuleManager中是否存在规则,如果不存在则新建一个ArrayList用于存放
        rules = rules != null ? rules : new ArrayList<>();
        FlowRule rule1 = new FlowRule();
        // 设置资源名称
        rule1.setResource(GETUSER_KEY);
        // QPS控制在1以内
        rule1.setCount(1);
        // QPS限流
        rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule1.setLimitApp("default");
        rules.add(rule1);
        FlowRuleManager.loadRules(rules);
        log.info(">>>限流服务接口配置加载成功>>>");
    }
}
3.2.2、使用 3.2.1 加载的流控规则
3.2.2.1、硬编码使用流控规则
    @GetMapping("/user/info-01")
    public String getUserInfo01(){
        Entry entry = null;
        try {
        	// 指定 3.2.1 中的资源名称
            entry = SphU.entry(SentinelRuleInitConfiguration.GETUSER_KEY);
            // 执行我们服务需要保护的业务逻辑
            return "张三" + RandomUtil.randomNumbers(5);
        } catch (Exception e) {
            e.printStackTrace();
            return "该服务接口已经达QPS上线!";
        } finally {
            // SphU.entry(xxx) 需要与 entry.exit() 成对出现,否则会导致调用链记录异常
            if (entry != null) {
                entry.exit();
            }
        }
    }

在浏览器快速调用几次就能看到触发限流规则响应指定信息。
在这里插入图片描述

3.2.2.2、使用@SentinelResource指定流控规则
    //@SentinelResource  value参数:流量规则资源名称、
    //blockHandler 限流/熔断出现异常执行的方法
    //Fallback 服务的降级执行的方法
    @SentinelResource(value = SentinelRuleInitConfiguration.GETUSER_KEY, blockHandler = "getUserInfoQpsException")
    @GetMapping("/user/info-02")
    public String getUserInfo02(){
        return "张三" + RandomUtil.randomNumbers(5);
    }

    /**
     * 被限流后返回的提示
     */
    public String getUserInfoQpsException(BlockException e) {
        e.printStackTrace();
        return "该接口已经被限流啦!";
    }

使用注解也是一样的,只是触发限流规则后会走我们指定的blockHandler
在这里插入图片描述

3.3、集成 Sentinel 控制台实现流控规则动态配置

3.3.1、添加Sentinel控制台连接配置
spring:
  application:
    name: kerwin-user
  cloud:
    sentinel:
      # 设置sentinel为热加载 默认为false
      eager: true
      # 配置Sentinel控制台连接信息 建议通过启动参数配置
      transport:
        # 控制台ip:端口
        dashboard: localhost:8180
        # 应用注册端口 默认8719
        port: 18819

PS:要是通过配置文件配置无法注册到 Sentinel控制台,可以通过JVM启动参数配置试一下

-Dcsp.sentinel.dashboard.server=127.0.0.1:8180
-Dcsp.sentinel.api.port=18819
-Dproject.name=kerwin-user

  • 参数说明:
    -Dcsp.sentinel.dashboard.server:指定控制台地址和端口。
    -Dproject.name:在sentinel控制台中展示的项目名称。
    -Dcsp.sentinel.api.port:指定客户端监控 API 的端口(默认是 8719),如控制台修改规则,则会向该端口推送规则信息。

注册成功后可以看到多了一个kerwin-user,并且之前配置的流控规则也被加载到控制台。
在这里插入图片描述

3.3.2、通过控制台添加新流控规则测试效果
3.3.2.1、先准备一个接口(这个接口只简单返回一个字符串)
    @GetMapping("/user/info-03")
    public String getUserInfo03(){
        return "李四" + RandomUtil.randomNumbers(5);
    }
3.3.2.2、控制台添加流控规则

在这里插入图片描述

除了通过@SentinelResource指定接口使用的资源名称,还可以将资源名设置成接口完整地址是会被自动匹配的,在spring-cloud-starter-alibaba-sentinel包中已经做了适配。
在这里插入图片描述

3.3.2.3、测试流控效果

      快速请求几次可以看到触发了流控,响应了Sentinel的默认流控提示信息,这个响应信息可以做统一处理,文章末尾提供实现代码。
在这里插入图片描述

四、项目整合 Nacos 实现 Sentinel 规则持久化

  • 因为Sentinel客户端是将规则数据存储在本地JVM中,Sentinel控制台会读取客户端的规则到控制台显示,Sentinel控制台只做规则读取和规则配置并不会做数据的存储,规则修改之后Sentinel会将规则PUSH到客户端,当客户端重启以后新增规则也会消失,如果Sentinel控制台重启客户端没有重启这个时候Sentinel控制台又能将客户端缓存中的规则和族点链路信息读取到控制台。
    • 解决方法一:修改Sentinel客户端源码在新增和修改规则时将数据重新储存到数据库或者本地文件,当客户端宕机重启后Sentinel控制台根据客户端唯一标识取出对应数据push到客户端。
    • 解决方法二:集成Nacos等工具,将规则信息储存在配置中心,在客户端项目启动时去读取,也可以随时修改可以做到动态更新,但是做不到Sentinel控制台修改规则然后同步到nacos配置中心。

4.1、添加 Sentinel 集成 Nacos 包

      sentinel读取nacos配置需要添加这个适配包。

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

4.2、Nacos配置中心创建我们的流控规则(kerwin-user-flow-rules)

在这里插入图片描述
在这里插入图片描述

规则JSON

[
    {
        "resource": "/user/info-03",
        "limitApp": "default",
        "grade": 1,
        "count": 2,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]
  • 各字段含义
    • resource:这是流控规则所针对的资源名称,你要依据实际业务情况对其进行替换。
    • limitApp:指定受此规则限制的调用来源,default 表示对所有调用来源都生效。
    • grade:流控阈值类型,1 代表 QPS(每秒查询率),0 代表线程数。
    • count:设定的流控阈值。在上述例子中,QPS 的阈值为 2,即每秒请求数量超过 2 时就会触发流控。
    • strategy:流控策略,0 表示直接对当前资源进行限流。
    • controlBehavior:流控效果,0 代表快速失败,也就是请求超过阈值时直接拒绝。
    • clusterMode:是否为集群流控模式,false 表示使用单机流控模式。

4.3、配置文件配置加载Nacos配置中心流控规则json

spring:
  cloud:
    sentinel:
      # 设置sentinel为热加载 默认为false
      eager: true
      # 使用nacos来做持久化
      datasource:
        ## 配置流控规则,名字任意
        ds-flow:
          nacos:
            ## nacos的地址
            server-addr: 172.16.8.169:8848
            ## 配置ID
            dataId: kerwin-user-flow-rules
            username: nacos
            password: nacos
            namespace: springcloud-component-example
            ## 配置分组,默认是DEFAULT_GROUP
            groupId: DEFAULT_GROUP
            ## 配置存储的格式
            data-type: json
            ## rule-type设置对应得规则类型,总共七大类型,在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现
            rule-type: flow

4.4、验证配置是否有效

      重启应用服务查看 Sentinel控制台 Nacos中配置的规则是否注册上,如果成功可以看到刚刚配置的规则已经加载到流控规则中,但是之前我们通过代码配置的流控规则没了,这是因为Sentinel加载Nacos中配置规则在我们通过代码配置之后,通过代码配置的规则被覆盖了,不过线上环境也不推荐使用代码直接配置,还是统一使用配置中心比较合适。

在这里插入图片描述

五、常用规则配置JSON解析以及加载

      这里会对所有服务保护规则JSON配置参数做解析,将对应规则配置到Nacos配置中心,在配置文件中指定规则加载即可。

5.1、流量控制规则(FlowRule)

5.1.1、配置流控规则JSON
  • Nacos配置中心添加流控规则kerwin-user-flow-rules
    在这里插入图片描述
  • 规则JSON
    [
        {
            "resource": "youResource",
            "limitApp": "default",
            "grade": 1,
            "count": 10,
            "strategy": 0,
            "controlBehavior": 0,
            "clusterMode": false
        }
    ]
    
  • 字段解释:
    • resource:此为流控规则所针对的资源名称,代表了系统里某个具体的功能或者服务,像某个接口的调用。
    • limitApp:指定受该规则限制的调用来源。default 意味着对所有调用来源都生效;也可以填入具体的应用名,实现对特定调用来源的限流。
    • grade:流控阈值类型,具体取值如下:
      • 0:代表线程数限流,即当并发线程数超过阈值时触发限流。
      • 1:代表 QPS(每秒查询率)限流,即当每秒的请求数超过阈值时触发限流。
    • count:流控阈值,其含义由 grade 字段决定。若 grade 为 0,它就是最大并发线程数;若 grade 为 1,它就是每秒允许的最大请求数。
    • clusterMode:是否为集群流控模式。false 表示单机流控模式;true 表示集群流控模式。
    • strategy:流控策略,具体取值如下:
      • 0:直接对当前资源进行限流。
      • 1:关联资源限流,当关联资源的 QPS 超过设置的阈值时,对当前资源进行限流。
      • 2:链路限流,是指只对指定链路的请求进行限流。在复杂的系统中,一个资源可能会被多个不同的链路调用,链路流控可以针对特定的调用链路进行流量控制,而不影响其他链路对该资源的访问。。
    • refResource:关联或入口资源名,当strategy 为 2或3时有效,
    • controlBehavior:流控效果,具体取值如下:
      • 0:快速失败,当请求超过阈值时,直接拒绝请求并抛出限流异常。
      • 1:Warm Up(预热),让系统有一个预热的过程,避免瞬间流量过大。
      • 2:匀速排队,请求会进入队列进行排队,按照固定的速率处理请求。
      • 3:Warm Up + 匀速排队,结合了预热和匀速排队的特性。
    • warmUpPeriodSec:仅在 controlBehavior 为 1(Warm Up)或者 3(Warm Up + 匀速排队)时有效,代表预热的时长,单位是秒。
    • maxQueueingTimeMs:仅在 controlBehavior 为 2(匀速排队)或者 3(Warm Up + 匀速排队)时有效,代表请求在队列中的最大排队时间,单位是毫秒。若排队时间超过该值,请求将被拒绝。
    • slowRatioThreshold:仅在 controlBehavior 为 2(匀速排队)或者 3(Warm Up + 匀速排队)时有效,代表慢调用比例阈值。当慢调用(处理时间超过某个阈值的请求)的比例超过该阈值时,会调整排队的速率。
5.1.2、配置文件配置加载Nacos配置中心流控规则json
spring:
  cloud:
    sentinel:
      # 设置sentinel为热加载 默认为false
      eager: true
      # 使用nacos来做持久化
      datasource:
        ## 配置规则,名字任意
        ds-flow:
          nacos:
            ## nacos的地址
            server-addr: 172.16.8.169:8848
            ## 配置ID
            dataId: kerwin-user-flow-rules
            username: nacos
            password: nacos
            namespace: springcloud-component-example
            ## 配置分组,默认是DEFAULT_GROUP
            groupId: DEFAULT_GROUP
            ## 配置存储的格式
            data-type: json
            ## rule-type设置对应得规则类型,总共七大类型,在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现
            ## flow:流控 degrade:熔断降级  param-flow:热点参数规则  system:系统保护规则  authority:授权规则
            rule-type: flow

5.2、熔断降级规则(DegradeRule)

5.2.1、配置熔断降级规则JSON
  • Nacos配置中心添加流控规则kerwin-user-degrade-rules
  • 规则JSON
[
    {
        "resource": "youResource",
        "count": 0.5,
        "timeWindow": 10,
        "grade": 0,
        "minRequestAmount": 5,
        "statIntervalMs": 10000,
        "slowRatioThreshold": 0.5,
        "maxAllowedRt": 200
    }
]
  • 字段解释:
    • resource:要进行熔断降级控制的资源名称,代表了系统中的某个特定功能或服务,例如某个接口的调用。
    • count:熔断阈值,具体含义根据 grade 字段的值而定。
      • 当 grade 为 0(错误比例策略)时,count 表示错误请求数占总请求数的比例阈值,范围是 0.0 - 1.0。例如,值为 0.5 表示错误比例达到 50% 时触发熔断。
      • 当 grade 为 1(平均响应时间策略)时,count 表示平均响应时间的阈值(单位:毫秒)。例如,值为 200 表示平均响应时间超过 200 毫秒时触发熔断。
      • 当 grade 为 2(异常数策略)时,count 表示异常请求数的阈值。
        timeWindow:熔断的时长,单位为秒。例如,值为 10 表示熔断持续 10 秒,在这期间对该资源的请求会被直接熔断处理。
    • grade:降级策略,有以下几种取值:
      • 0:错误比例策略,根据错误请求数占总请求数的比例来判断是否熔断。
      • 1:平均响应时间策略,根据请求的平均响应时间来判断是否熔断。
      • 2:异常数策略,根据异常请求数来判断是否熔断。
    • minRequestAmount:最小请求数,只有在统计周期内的请求数达到该值时,才会进行熔断判断。例如,设置为 5 表示当请求数至少为 5 时,才会根据 count 和 grade 的规则判断是否熔断。
    • statIntervalMs:统计时长,单位为毫秒,用于统计错误比例、平均响应时间或异常数。例如,值为 10000 表示统计最近 10 秒内的数据。
    • slowRatioThreshold:慢调用比例阈值,仅在平均响应时间策略(grade 为 1)下有效。它表示慢调用(响应时间超过 maxAllowedRt)在总请求数中的占比阈值,范围是 0.0 - 1.0。例如,值为 0.5 表示慢调用比例达到 50% 时触发熔断。
    • maxAllowedRt:最大允许的响应时间,仅在平均响应时间策略(grade 为 1)下有效。当请求的响应时间超过该值时,该请求会被视为慢调用。
5.2.2、配置文件配置加载Nacos配置中心熔断降级规则json
spring:
  cloud:
    sentinel:
      # 设置sentinel为热加载 默认为false
      eager: true
      # 使用nacos来做持久化
      datasource:
        ds-flow:
          nacos:
            server-addr: 172.16.8.169:8848
            dataId: kerwin-user-flow-rules
            username: nacos
            password: nacos
            namespace: springcloud-component-example
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow
        ## 配置熔断降级规则,名字任意
        ds-degrade:
          nacos:
            ## nacos的地址
            server-addr: 172.16.8.169:8848
            ## 配置ID
            dataId: kerwin-user-degrade-rules
            username: nacos
            password: nacos
            namespace: springcloud-component-example
            ## 配置分组,默认是DEFAULT_GROUP
            groupId: DEFAULT_GROUP
            ## 配置存储的格式
            data-type: json
            ## rule-type设置对应得规则类型,总共七大类型,在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现
            ## flow:流控 degrade:熔断降级  param-flow:热点参数规则  system:系统保护规则  authority:授权规则
            rule-type: degrade

5.3、热点参数规则(ParamFlowRule)

5.3.1、配置熔断降级规则JSON
  • Nacos配置中心添加流控规则kerwin-user-param-flow-rules

  • 规则JSON

    [
        {
            "resource": "youResource",
            "count": 5,
            "grade": 1,
            "paramIdx": 0,
            "durationInSec": 1,
            "controlBehavior": 0,
            "clusterMode": false,
            "clusterConfig": {
                "thresholdType": 1,
                "fallbackToLocalWhenFail": true
            },
            "paramFlowItemList": [
                {
                	"classType": "java.lang.String",
                    "object": "paramValue",
                    "count": 10
                }
            ]
        }
    ]
    
  • 字段解释:

    • resource:要进行热点参数流控的资源名称,代表系统中的某个特定功能或接口。
    • count:针对普通参数值的流控阈值。当参数不是 paramFlowItemList 中指定的特殊值时,使用该阈值进行流控。
    • grade:流控阈值类型,1:表示基于 QPS(每秒查询率)进行流控。
    • paramIdx:参数索引,指定要对方法参数列表中哪个位置的参数进行热点流控。索引从 0 开始,例如 0 表示第一个参数。
    • durationInSec:统计时长,单位为秒。Sentinel 会在这个时间段内统计参数的访问情况,以判断是否触发流控。
    • controlBehavior:流控效果,取值如下:
      • 0:快速失败,当请求超过阈值时直接拒绝请求。
      • 1:Warm Up(预热),系统启动初期允许较低的流量,随着时间推移逐渐增加到正常阈值。
      • 2:匀速排队,请求会进入队列,按照固定速率处理,避免流量突发。
    • clusterMode:是否为集群流控模式。true 表示开启集群流控,false 表示使用单机流控。
    • clusterConfig:集群流控的相关配置,是一个对象,包含以下字段:
      • thresholdType:集群阈值类型,0 表示全局阈值,即整个集群共享一个阈值;1 表示单机均摊阈值,每个节点有自己的阈值。
      • fallbackToLocalWhenFail:当集群流控失败时,是否回退到单机流控模式,true 表示回退,false 表示不回退。
    • paramFlowItemList:针对特定参数值的流控规则列表,是一个数组,数组中的每个对象包含以下字段:
      • classType:参数类型 int、double、java.lang.String、long、float、char、byte
      • object:特定的参数值。
      • count:针对该特定参数值的流控阈值,会覆盖普通参数的 count 阈值。
5.3.2、配置文件配置加载Nacos配置中心熔断降级规则json
spring:
  cloud:
    sentinel:
      # 设置sentinel为热加载 默认为false
      eager: true
      # 使用nacos来做持久化
      datasource:
        ## 配置规则,名字任意
        ds-param-flow:
          nacos:
            ## nacos的地址
            server-addr: 172.16.8.169:8848
            ## 配置ID
            dataId: kerwin-user-param-flow-rules
            username: nacos
            password: nacos
            namespace: springcloud-component-example
            ## 配置分组,默认是DEFAULT_GROUP
            groupId: DEFAULT_GROUP
            ## 配置存储的格式
            data-type: json
            ## rule-type设置对应得规则类型,总共七大类型,在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现
            ## flow:流控 degrade:熔断降级  param-flow:热点参数规则  system:系统保护规则  authority:授权规则
            rule-type: param-flow

5.4、系统保护规则(SystemRule)

5.4.1、配置熔断降级规则JSON
  • Nacos配置中心添加流控规则kerwin-user-system-rules
  • 规则JSON
[
    {
        "highestCpuUsage": -1,
        "avgRt": -1,
        "maxThread": -1,
        "qps": 10,
        "highestSystemLoad": -1
    }
]
  • 字段解释:
    • highestCpuUsage:最大 CPU 使用率,超过该值时触发系统保护。
    • avgRt:平均响应时间,超过该值时触发系统保护。
    • maxThread:最大线程数,超过该值时触发系统保护。
    • qps:最大 QPS,超过该值时触发系统保护。
    • highestSystemLoad:最大系统负载,超过该值时触发系统保护。
5.4.2、配置文件配置加载Nacos配置中心熔断降级规则json
spring:
  cloud:
    sentinel:
      # 设置sentinel为热加载 默认为false
      eager: true
      # 使用nacos来做持久化
      datasource:
        ## 配置规则,名字任意
        ds-system:
          nacos:
            ## nacos的地址
            server-addr: 172.16.8.169:8848
            ## 配置ID
            dataId: kerwin-user-system-rules
            username: nacos
            password: nacos
            namespace: springcloud-component-example
            ## 配置分组,默认是DEFAULT_GROUP
            groupId: DEFAULT_GROUP
            ## 配置存储的格式
            data-type: json
            ## rule-type设置对应得规则类型,总共七大类型,在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现
            ## flow:流控 degrade:熔断降级  param-flow:热点参数规则  system:系统保护规则  authority:授权规则
            rule-type: system

六、Sentinel 规则触发响应信息统一处理

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.authority.AuthorityException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
import com.alibaba.csp.sentinel.slots.system.SystemBlockException;
import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;

@Component
public class SentinelExceptionHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws Exception {
        String msg = "触发服务保护!";
        if (ex instanceof FlowException) {
            msg = "请求过于频繁,被限流了!";
        } else if (ex instanceof DegradeException) {
            msg = "请求过于频繁,被降级了!";
        } else if (ex instanceof ParamFlowException) {
            msg = "热点数据请求过于频繁!";
        } else if (ex instanceof SystemBlockException) {
            msg = "请求过于频繁,触发系统限制!";
        } else if (ex instanceof AuthorityException) {
            msg = "授权规则不通过!";
        }
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Type", "application/json;charset=utf-8");
        response.setContentType("application/json;charset=utf-8");
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("code",500);
        resultMap.put("msg",msg);
        String errJson = JSON.toJSONString(resultMap);
        new ObjectMapper().writeValue(response.getWriter(), errJson);
    }
}

触发流控规则后调用了SentinelExceptionHandler 中的handle响应了我们自定义的异常信息。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/958823.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

窥探QCC518x-308x系列与手机之间的蓝牙HCI记录与分析 - 耳机篇

上一篇是介绍如何窥探手机端Bluetooth的HCI log, 本次介绍是如何窥探Bluetooth的HCI log-耳机篇. 这次跟QCC518x/QCC308x测试的手机是Samsung S23 Ultra. QCC518x/QCC308x透过HCI界面取得Log教学. 步骤1: 开启QMDE -> 选择ADK r1102 QCC3083 Headset workspace.步骤2: 点…

C++ list 容器用法

C list 容器用法 C 标准库提供了丰富的功能&#xff0c;其中 <list> 是一个非常重要的容器类&#xff0c;用于存储元素集合&#xff0c;支持双向迭代器。<list> 是 C 标准模板库&#xff08;STL&#xff09;中的一个序列容器&#xff0c;它允许在容器的任意位置快速…

SpringSecurity实现自定义用户认证方案

Spring Security 实现自定义用户认证方案可以根据具体需求和业务场景进行设计和实施&#xff0c;满足不同的安全需求和业务需求。这种灵活性使得认证机制能够更好地适应各种复杂的环境和变化‌。通过自定义认证方案&#xff0c;可以更好地控制和管理用户的访问权限&#xff0c;…

深入内核讲明白Android Binder【三】

深入内核讲明白Android Binder【三】 前言一、服务的获取过程内核源码解析1. 客户端获取服务的用户态源码回顾2. 客户端获取服务的内核源码分析2.1 客户端向service_manager发送数据1. binder_ioctl2. binder_ioctl_write_read3. binder_thread_write4. binder_transaction4.1 …

深入解析:Docker 容器如何实现文件系统与资源的多维隔离?

目录 一、RootFs1. Docker 镜像与文件系统层2. RootFs 与容器隔离的意义 二、Linux Namespace1. 进程命名空间1.1 lsns 命令说明1.2 查看“祖先进程”命名空间1.3 查看当前用户进程命名空间 2. 容器进程命名空间2.1 查看容器进程命名空间列表2.2 容器进程命名空间的具体体现 三…

解锁Java中的国密算法:安全保障的密钥

一、引言 在数字化浪潮席卷全球的当下&#xff0c;信息安全已然成为国家、企业乃至个人无法忽视的重要议题。国密算法&#xff0c;作为我国自主研发的密码算法体系&#xff0c;宛如坚固的盾牌&#xff0c;为国家信息安全筑起了一道坚不可摧的防线。它的诞生&#xff0c;不仅承载…

proxysql读写分离的部署

关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld setenforce 0设置主机名称 hostnamectl set-hostname zhangyijia-host71.database.com && bash hostnamectl set-hostname zhangyijia-host72.database.com && bash两台主机安装m…

Android各个版本存储权限适配

一、Android6.0-9.0 1、动态权限申请&#xff1a; private static String[] arrPermissions {android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE,android.Manifest.permission.ACCESS_FINE_LOCATION,android.Manifest.…

【xcode 16.2】升级xcode后mac端flutter版的sentry报错

sentry_flutter 7.11.0 报错 3 errors in SentryCrashMonitor_CPPException with the errors No type named terminate_handler in namespace std (line 60) and No member named set_terminate in namespace std 替换sentry_flutter版本为&#xff1a; 8.3.0 从而保证oc的…

ASP.NET Core 6.0 如何处理丢失的 Startup.cs 文件

介绍 .NET 6.0 已经发布&#xff0c;ASP.NET Core 6.0 也已发布。其中有不少变化让很多人感到困惑。例如&#xff0c;“谁动了我的奶酪”&#xff0c;它在哪里Startup.cs&#xff1f;在这篇文章中&#xff0c;我将深入研究这个问题&#xff0c;看看它移动到了哪里以及其他变化。…

idea plugin插件开发——入门级教程(IntelliJ IDEA Plugin)

手打不易&#xff0c;如果转摘&#xff0c;请注明出处&#xff01; 注明原文&#xff1a;idea plugin插件开发——入门级教程&#xff08;IntelliJ IDEA Plugin&#xff09;-CSDN博客 目录 前言 官方 官方文档 代码示例 开发前必读 Intellij、Gradle、JDK 版本关系 plu…

概率密度函数(PDF)分布函数(CDF)——直方图累积直方图——直方图规定化的数学基础

对于连续型随机变量&#xff0c;分布函数&#xff08;Cumulative Distribution Function, CDF&#xff09;是概率密度函数&#xff08;Probability Density Function, PDF&#xff09;的变上限积分&#xff0c;概率密度函数是分布函数的导函数。 如果我们有一个连续型随机变量…

三分钟简单了解一些HTML的标签和语法_02

1.a标签演示 点击然后跳转 代码加入title 2.图片链接 3.锚点链接 点击就会跳转的当前位置 4.a标签小知识补充 该实例会跳转到顶,锚点链接则会跳转到相应的锚点 5. 结果:直接跳转到该页面的锚点处 6. 在 HTML 中&#xff0c;<tr>标签表示表格中的行&#xff08;TableRow&…

mysql 学习3 SQL语句--整体概述。SQL通用语法;DDL创建数据库,查看数据库,删除数据库,使用数据库;

SQL通用语法 SQL语句分类 DDL data definition language : 用来创建数据库&#xff0c;创建表&#xff0c;创建表中的字段&#xff0c;创建索引。因此成为 数据定义语言 DML data manipulation language 有了数据库和表以及字段后&#xff0c;那么我们就需要给这个表中 添加数…

基于ollama,langchain,springboot从零搭建知识库三【解析文档并存储到向量数据库】

安装环境 安装pgvector&#xff0c;先设置docker镜像源&#xff1a; vim /etc/docker/daemon.json {"registry-mirrors": ["https://05f073ad3c0010ea0f4bc00b7105ec20.mirror.swr.myhuaweicloud.com","https://mirror.ccs.tencentyun.com",&…

C# OpenCV机器视觉:红外体温检测

在一个骄阳似火的夏日&#xff0c;全球却被一场突如其来的疫情阴霾笼罩。阿强所在的小镇&#xff0c;平日里熙熙攘攘的街道变得冷冷清清&#xff0c;人们戴着口罩&#xff0c;行色匆匆&#xff0c;眼神中满是对病毒的恐惧。阿强作为镇上小有名气的科技达人&#xff0c;看着这一…

计算机视觉算法实战——无人机检测

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​ 1. 引言✨✨ 随着无人机技术的快速发展&#xff0c;无人机在农业、物流、监控等领域的应用越来越广泛。然而&#xff0c;无人机的滥用也带…

日志收集Day004

1.filebeat安装 基于二进制安装filebeat (1)下载filebeat软件包 (2)解压软件包 tar xf filebeat-7.17.5-linux-x86_64.tar.gz -C /app/softwares/ (3)验证filebeat安装是否成功 cd /app/softwares/filebeat-7.17.5-linux-x86_64/ ln -svf pwd/filebeat /usr/local/sbin/ f…

Vue入门(Vue基本语法、axios、组件、事件分发)

Vue入门 Vue概述 Vue (读音/vju/&#xff0c;类似于view)是一套用于构建用户界面的渐进式框架&#xff0c;发布于2014年2月。与其它大型框架不同的是&#xff0c;Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三…

缓存商品、购物车(day07)

缓存菜品 问题说明 问题说明&#xff1a;用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大。 结果&#xff1a; 系统响应慢、用户体验差 实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询…