前面介绍Sentinel的流控、熔断降级等功能,同时Sentinel应用也在面临着一个问题:我们在Sentinel后台管理界面中配置了一堆流控、降级规则,但是Sentinel一重启,这些规则全部消失了。那么我们就要考虑Sentinel的持久化问题。
Sentinel为我们提供了几种持久化的解决方案:
我们这里采用Nacos的方式进行存储这些数据。
Tip:既然使用Nacos进行持久化这些Sentinel规则数据,那么你的Nacos首先肯定是已经具备了持久化的环境的~~
pom.xml文件加入Nacos数据源的依赖
<dependency>
<groupId>com.alibaba.cspgroupId>
<artifactId>sentinel-datasource-nacosartifactId>
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
}
]
以上配置,我们的/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
类,有以下几个属性:
新增一个/sentinelTestC
的资源,然后使用Jmeter压测一下,系统规则
是系统级别的,即相对于资源的流控是比较粗粒度的了。
同样地,其他的规则,可以找到它对应的Java配置方法,找到那个类,举一反三,将对应的配置修改一下就可以了。
有两个点需要注意下: