当前位置:   article > 正文

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

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.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.8.3</version>
        </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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/512583
推荐阅读
相关标签
  

闽ICP备14008679号