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的安装与配置

扫描二维码关注公众号,回复: 14622950 查看本文章

@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.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.8.3</version>
        </dependency>
  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. 然后在Nacos控制台添加对应的配制文件(具体的参数后面会解释)
  • 流控规则的配制文件:

image-20220909164421806

[
    {
    
    
        "resource": "test",
        "limitApp": "default",
        "grade": 1,
        "count": 2,
        "strategy": 0,
        "controlBehavior": 0,
        "clusterMode": false
    }
]
  • 降级规则的配制文件

image-20220909164517963

[
  {
    
    
    "resource": "getUser",
    "count": 20.0,
    "grade": 0,
    "passCount": 0,
    "timeWindow": 10
  }
]
  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

猜你喜欢

转载自blog.csdn.net/apple_52109766/article/details/126786976