Sentinel数据持久化
前面介绍Sentinel的流控、熔断降级等功能,同时Sentinel应用也在面临着一个问题:我们在Sentinel后台管理界面中配置了一堆流控、降级规则,但是Sentinel一重启,这些规则全部消失了。那么我们就要考虑Sentinel的持久化问题。
Sentinel为我们提供了几种持久化的解决方案:
- 存储到文件
- 使用Redis存储
- 使用Nacos存储
- 使用Zookeeper存储
- 使用Apollo存储
我们这里采用Nacos的方式进行存储这些数据。
Tip:既然使用Nacos进行持久化这些Sentinel规则数据,那么你的Nacos首先肯定是已经具备了持久化的环境的~~
实现持久化
pom.xml文件加入Nacos数据源的依赖
<!-- sentinel持久化访问Nacos的数据源依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
修改bootstrap.yml文件,增加datasource的配置
server:
port: 9001
spring:
application:
name: consumer # 应用名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
sentinel:
transport:
port: 8719 # 启动http server,并且该服务与Sentinel仪表板进行交互,使sentinel可以控制应用,若端口占用则8719+1依次扫描
dashboard: 127.0.0.1:8080 # 仪表版访问地址
datasource: # sentinel数据源
ds1: # 自定义连接名
nacos:
server-addr: localhost:8848 # nacos服务地址
dataId: sentinel-consumer-ds1 # nacos的dataId
groupId: DEFAULT_GROUP # 默认分组
data-type: json # 数据类型 json类型
rule-type: flow # flow表示流控规则
rule-type
中的值,可以参考RuleType
枚举类
五种规则持久化到Nacos中
authority
(授权规则)degrade
(降级规则)flow
(流控规则)param
(热点规则)system
(系统规则)
当你的rule-type没设置时,程序启动时会报空指针异常
在Nacos的控制面板新建sentinel-consumer-ds1
的DataId,具体配置内容如下:
[
{
"resource":"/sentinelTestB",
"limitApp":"default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
首先在Nacos后台管理界面上配置DataId和GroupId一定是和配置文件中一一对应的,json中[]
表示可以配置多个
resource
:表示资源名称limitApp
:表示要限制哪些来源的调用grade
:阈值类型,取值参考RuleConstant
类(0–线程数限流 1–QPS限流)count
:表示限流阈值strategy
:表示流控模式,0表示直接,1表示关联,2表示链路controlBehavior
:流控效果(0表示快速失败,1表示Warm Up,2表示排队等待)
那么这些参数,不同的规则该设置哪些参数呢,可以去参考某些规则类查看
-
流控规则:
FlowRule
-
熔断降级:
DegradeRule
字段 说明 默认值 resource 资源名,即规则的作用对象 grade 熔断策略,支持慢调用比例/异常比例/异常数策略 慢调用比例 count 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值 timeWindow 熔断时长,单位为 s minRequestAmount 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) 5 statIntervalMs 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) 1000 ms slowRatioThreshold 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入) -
热点规则:
ParamFlowRule
字段 说明 默认值 resource 资源名,即规则的作用对象 grade 限流模式 QPS 模式 count 限流阈值,必填 durationInSec 统计窗口时间长度(单位为秒),1.6.0 版本开始支持 1s controlBehavior 流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持 快速失败 maxQueueingTimeMs 最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持 0 paramIdx 热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置 paramFlowItemList 参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型
这些json的规则除了可以在Sentinel控制面板控制之外,还可以用Java代码的方式,但是不够灵活。
配置好上面的属性后,使用Jmeter请求/sentinelTestB
接口,测试流控效果。
可以看到,流控已经生效了。再到sentinel仪表板中看下:
已经生成好了一个流控规则。
再来试试降级规则
bootstrap.yml
中增加ds2数据源
server:
port: 9001
spring:
application:
name: consumer # 应用名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
sentinel:
transport:
port: 8719 # 启动http server,并且该服务与Sentinel仪表板进行交互,使sentinel可以控制应用,若端口占用则8719+1依次扫描
dashboard: 127.0.0.1:8080 # 仪表版访问地址
datasource: # sentinel数据源
ds1:
nacos:
server-addr: localhost:8848 # nacos服务地址
dataId: sentinel-consumer-ds1 # nacos的dataId
groupId: DEFAULT_GROUP # 默认分组
data-type: json # 数据类型 json类型
rule-type: flow # flow表示流控规则
ds2:
nacos:
server-addr: localhost:8848 # nacos服务地址
dataId: sentinel-consumer-ds2 # nacos的dataId
groupId: DEFAULT_GROUP # 默认分组
data-type: json # 数据类型 json类型
rule-type: degrade # degrade表示降级规则
nacos面板中添加sentinel-consumer-ds2
文件
[
{
"resource":"/sentinelTest",
"count":1,
"grade":2,
"timeWindow":5,
"minRequestAmount":1
}
]
- timeWindow:表示时间窗口,熔断的时间数。
- count:阈值
- grade:降级策略,参考RuleConstant类(0-RT 1-异常比例 2-异常数)
以上配置,我们的/sentinelTest
模拟一个异常,然后用Jmeter多次请求
进入熔断降级。
最后再来看下系统规则的一个实例
bootstrap.yml中
server:
port: 9001
spring:
application:
name: consumer # 应用名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos服务地址
sentinel:
transport:
port: 8719 # 启动http server,并且该服务与Sentinel仪表板进行交互,使sentinel可以控制应用,若端口占用则8719+1依次扫描
dashboard: 127.0.0.1:8080 # 仪表版访问地址
datasource: # sentinel数据源
ds1:
nacos:
server-addr: localhost:8848 # nacos服务地址
dataId: sentinel-consumer-ds1 # nacos的dataId
groupId: DEFAULT_GROUP # 默认分组
data-type: json # 数据类型 json类型
rule-type: flow # flow表示流控规则
ds2:
nacos:
server-addr: localhost:8848 # nacos服务地址
dataId: sentinel-consumer-ds2 # nacos的dataId
groupId: DEFAULT_GROUP # 默认分组
data-type: json # 数据类型 json类型
rule-type: degrade # degrade表示降级规则
ds3:
nacos:
server-addr: localhost:8848 # nacos服务地址
dataId: sentinel-consumer-ds3 # nacos的dataId
groupId: DEFAULT_GROUP # 默认分组
data-type: json # 数据类型 json类型
rule-type: system # system表示系统规则
在nacos中新增 ds3的,sentinel-consumer-ds3
文件
[
{
"qps":1
}
]
系统规则对应的是SystemRule
类,有以下几个属性:
- avgRt:系统平均响应时间
- highestCpuUsage:CPU使用率
- highestSystemLoad:负载
- maxThread:最大线程数
- qps:每秒处理的请求数量
新增一个/sentinelTestC
的资源,然后使用Jmeter压测一下,系统规则
是系统级别的,即相对于资源的流控是比较粗粒度的了。
同样地,其他的规则,可以找到它对应的Java配置方法,找到那个类,举一反三,将对应的配置修改一下就可以了。
有两个点需要注意下:
- 在Nacos控制台修改规则,Sentinel这边的规则会即时生效,重启服务后依然是有效的,毕竟已经做好持久化了
- 在Sentinel控制台修改的规则,不会被修改到nacos中,重启后还会变为nacos设置的值