• Sentinel集成Nacos对流控与降级规则的持久化


    往期回顾

    Nacos的安装与配置

    Spring Cloud集成Nacos作为注册中心

    LoadBalacer集成Nacos实现负载均衡

    常见的负载均衡策略分析

    Spring Cloud集成Dubbo实现RPC调用

    SpringCloud集成Nacos作为配置中心

    Nacos整合OpenFegin实现RPC调用

    Nacos整合Gateway入门实例

    Spring Cloud Gateway的过滤器配置

    Nacos整合Gateway实现动态路由

    Sentinel的安装与配置

    @SentinelResource详解

    Sentinel的流控与熔断降级规则详解

    在上一篇我们介绍了流控和降级熔断这几个概念,并对Sentinel的流控与降级的规则进行了进一步的阐述。但是我们之前在控制台配置的规则,控制台是默认通过API推送至客户端并直接更新到内存中。一旦我们重启应用,这些规则便会消失,所以,接下来就让我们一起来看看如何将这些规则持久化吧。

    规则的管理及推送

    一般来说,规则的推送有下面三种模式:

    推送模式说明优点缺点
    原始模式API 将规则推送至客户端并直接更新到内存中,扩展写数据源简单,无任何依赖不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境
    Pull 模式扩展写数据源, 客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等简单,无任何依赖;规则持久化不保证一致性;实时性不保证,拉取过于频繁也可能会有性能问题。
    Push 模式扩展读数据源,规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源。规则持久化;一致性;快速引入第三方依赖

    前面两种模式不是我们的重点,这里不再做赘述,感兴趣的同学可以自行查阅官网

    Push模式

    生产环境下一般更常用的是 push 模式的数据源。对于 push 模式的数据源,如远程配置中心(ZooKeeper, Nacos, Apollo等等),推送的操作不应由 Sentinel 客户端进行,而应该经控制台统一进行管理,直接进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。因此推送规则正确做法应该是 配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel,而不是经 Sentinel 数据源推送至配置中心。这样的流程就非常清晰了:

    Remote push rules to config center

    Sentinel对Nacos做了适配,这让我们很容易集成Nacos作为数据源进行配置,接下来我们就以Nacos为例来演示一下如何对Sentinel的规则进行持久化

    快速开始

    1. 引入Nacos作为数据源还需要引入以下依赖
            <dependency>
                <groupId>com.alibaba.cspgroupId>
                <artifactId>sentinel-datasource-nacosartifactId>
                <version>1.8.3version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    1. 然后在配置文件中配置数据源:
    spring:
      application:
        name: user-service
      cloud:
        sentinel:
          transport:
            #配置 Sentinel dashboard 地址
            dashboard: 192.168.199.128:8858
            #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口
            port: 8719
          datasource:
            ds1:
              nacos:
                server-addr: 192.168.199.128:8848 #Nacos地址
                dataId: ${spring.application.name}-flow-sentinel #dataID
                groupId: DEFAULT_GROUP
                data-type: json # 配置文件的格式
                # 注意网关流控规则对应 gw-flow
                rule-type: flow # 表示流控规则,可配置规则:flow,degrade,authority,system,param-flow,gw-flow,gw-api-group
            ds2:
              nacos:
                server-addr: 192.168.199.128:8848 #Nacos地址
                dataId: ${spring.application.name}-degrade-sentinel
                groupId: DEFAULT_GROUP
                data-type: json
                rule-type: degrade #表示降级规则,可配置规则:flow,degrade,authority,system,param-flow,gw-flow,gw-api-group
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    1. 然后在Nacos控制台添加对应的配制文件(具体的参数后面会解释)
    • 流控规则的配制文件:

    image-20220909164421806

    [
        {
            "resource": "test",
            "limitApp": "default",
            "grade": 1,
            "count": 2,
            "strategy": 0,
            "controlBehavior": 0,
            "clusterMode": false
        }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 降级规则的配制文件

    image-20220909164517963

    [
      {
        "resource": "getUser",
        "count": 20.0,
        "grade": 0,
        "passCount": 0,
        "timeWindow": 10
      }
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    1. 启动服务,然后先访问一次刚才配置的资源(Sentinel懒加载机制),然后在控制台观察添加的规则是否生效

    image-20220909164851234

    image-20220909164900682

    我们可以看到,刚才在Nacos中添加的流控和降级规则已经在控制台中生效,我们对接口进行测试

    image-20220909164949290

    如上图所示,对应的流控规则已经生效

    注意,在Sentinel控制台中添加的规则并不会同步到Nacos中,应用一旦重启,在控制台添加的规则依然会失效

    在Nacos控制台对Sentinel规则的更改会同步到Sentinel控制以及应用程序中

    规则的种类

    Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则 和 热点参数规则。

    流量控制规则

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

    同一个资源可以同时有多个限流规则,检查规则时会依次检查。

    我们对应控制台的属性来看:

    Sentinel控制台

    熔断降级规则

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

    同一个资源可以同时有多个降级规则。

    访问控制规则

    很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制(黑白名单控制)的功能。来源访问控制根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。

    来源访问控制规则(AuthorityRule)非常简单,主要有以下配置项:

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

    热点规则

    热点参数规则(ParamFlowRule)类似于流量控制规则(FlowRule):

    属性说明默认值
    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集群流控相关配置

    何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:

    • 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
    • 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

    热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

    其他规则我不再做解释,感兴趣的同学可以自行查阅Sentinel官方文档

    OK,到这里关于Sentinel的规则持久化就介绍到这里啦,感谢大家的观看

    项目源码:gitee github

  • 相关阅读:
    【Redis】Redis中的Big Key问题:排查与解决思路
    企业数字化转型,为什么需要企业门户?
    ISP--Black Level Correction(黑电平矫正)
    2023年09月青少年软件编程C语言二级真题答案——持续更新.....
    Axios 中的文件上传(Upload File)方法
    百度开源分布式id生成器集成--真香警告
    vue返回上一页(后退)的几种方法与区别
    如何测试 esp-matter_example_light 例程
    centos7虚拟机部署苍穹私有云环境记录
    NBlog Java定时任务-备份MySQL数据
  • 原文地址:https://blog.csdn.net/apple_52109766/article/details/126786976