1.为什么需要持久化
通常情况下,使用sentinel都是sentinel控制台与sentinel核心库(客户端)搭配使用。我们在控制台定义流控。熔断等类别的规则,客户端拉取规则进实现。
但是有一个核心问题,拉取的规则都被存在了内存中。也就是说一旦服务重启,规则就消失了。但是部署到线上这种问题是绝不能出现的,因此就有了规则持久化的需求
2.持久化思路
内存持久化模式(默认)
sentinel默认使用的持久化模式。数据保存在内存中。服务重启后,内容消失
pull模式
pull模式下,我们需要引入一个第三方的存储中心。将规则信息保存到第三方的存储中心,客户端从第三方存储中心拉取数据。
可以使用Apoll,Nacos,Zookeeper等作为第三方存储中心。为了适配spring-cloud-albaba的生态,这里使用nacos的配置中心特性,来作为第三方的存储中心
所有规则的变更都是通过第三方存储中心实现,控制台只做一个查询展示的作用
push模式

- 控制台将规则推送到Nacos或其他远程配置中心。Sentinel客户端链接Nacos,获取规则配置;并监听Nacos配置变化,如发生变化,就更新本地缓存(从而让本地缓存总是和Nacos一致)
- 控制台监听Nacos配置变化,如发生变化就更新本地缓存(从而让控制台本地缓存总是和Nacos一致)
所有规则的变更可以通过控制台或第三方存储中心实现。控制台可实现配置变更以及配置的实时查询
3.push模式持久化步骤
4.pull模式持久化步骤
引入依赖
<!--Sentinel持久化 依赖--><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency>
定义资源
@GetMapping@SentinelResource(value = "getNoParam",blockHandler = "getHandler")public String get() {ServiceInstance choose = loadBalancerClient.choose("service-provider");String url = "http://" + choose.getHost() + ":" + choose.getPort() + "/api/v1/provider";return restTemplate.getForObject(url, String.class);}
Nacos添加配置
具体配置如图
配置说明
- DataID:个人习惯通常用sentinel-{规则类型}-rule
- Group:SENTINEL_GROUP(符合命名规范即可)
- 描述:对配置进行一个描述说明
配置内容:配置内容的讲解放在文末
[{"resource": "getNoParam","limitApp": "default","grade": "1","count": "1","strategy": "0","controlBehavior": "0","clusterMode": false}]
修改yml文件
可通过spring.cloud.sentinel.datasource来配置nacos持久化
spring:application:name: service-discovercloud:nacos:discovery:server-addr: 8.142.132.135:8848 #服务注册到nacos注册中心的地址sentinel:eager: true #Sentinel开启饿汉式加载transport:dashboard: localhost:2222 #Sentinel控制台地址port: 8719 #Sentine客户端暴露给控制台的端口。默认8719端口,假如被占用会自动从8719开始依次+1扫描,直至找到未被占用的端口datasource:flow-rule: #自定义数据源名称nacos:server-addr: ${spring.cloud.nacos.discovery.server-addr} #nacos配置中心地址dataId: sentinel-flow-rule #nacos配置dataId参数groupId: SENTINEL_GROUP #nacos配置groupId参数data-type: json #nacos配置data-type参数rule_type: flow #定义规则类型为流控规则
验证
5.rule_type字段类型说明
rule_type字段具体可查看:com.alibaba.cloud.sentinel.datasource.RuleType
flow:流控规则
- degrade:熔断(降级)规则
- param-flow:热点规则
- authority:授权规则
-
6.不同规则参数说明
flow(流控规则)
流控规则具体参数可参考:com.alibaba.csp.sentinel.slots.block.flow.FlowRule
resource:资源名
- limitApp:针对来源,默认default
- grade:阈值类型:0-线程数,1-QPS
- count:单机阈值
- strategy:流控模式,0-直接,1-关联,2-链路
- controlBehavior:流控效果,0-快速失败,1-warmup,2-排队等候
- clusterMode:是否集群
流控规则示例
[{"resource": "getNoParam","limitApp": "default","grade": "1","count": "1","strategy": "0","controlBehavior": "0","clusterMode": false}]
degrade(熔断降级规则)
熔断(降级规则)具体参数可参考:com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule
- resource:资源名
- statIntervalMs:统计时间(单位为 ms),默认值1000ms
- minRequestAmount:最小请求数。在统计时间内,请求数需超过最小请求数才有可能触发熔断
- grade:熔断策略 0-慢调用比例,1-异常比例,2-异常数量
- count:慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值
- slowRatioThreshold:慢调用比例阈值,仅慢调用比例模式有效
- timeWindow:熔断时长,单位为 s
慢调用比例-熔断策略配置-示例
[{"resource": "getNoParam","statIntervalMs": 1000,"minRequestAmount": 1,"grade": 0,"count": 3000,"slowRatioThreshold": 0.5,"timeWindow": 5}]
异常比例-熔断策略配置-示例
[{"resource": "getNoParam","statIntervalMs": 1000,"minRequestAmount": 1,"grade": 1,"count": 0.5,"slowRatioThreshold": 0.5,"timeWindow": 5}]
异常数-熔断策略配置-示例
[{"resource": "getNoParam","statIntervalMs": 1000,"minRequestAmount": 1,"grade": 2,"count": 100,"slowRatioThreshold": 0.5,"timeWindow": 5}]
param-flow(热点规则)
热点规则具体参数可参考:com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule
- resource:资源名
- durationInSec:统计时长,单位秒,默认为1s
- grade:0-线程数 1-QPS(默认)
- paramIdx:参数索引,当前参数属于资源的第几个参数,默认从0开始
- count:限流阈值
- controlBehavior:限流策略 0-直接拒绝(默认)2-匀速
- maxQueueingTimeMs:请求队列等待时间,只有当controlBehavior=2时有效
- burstCount:应对突发流量额外允许的数量
- paramFlowItemList:额外参数项,可制定特殊参数限流
- clusterMode:是否为集群模式,默认false
- clusterConfig:集群限流配置
格外参数项参数参考
- classType:参数类型,包括byte、int、long、float、double、char、java.lang.String
- count:限流阈值
- object:额外参数项具体值
无参数额外项热点规则示例
[{"resource":"getNoParam2","durationInSec":1,"grade":1,"paramIdx":0,"count":1,"controlBehavior":0,"burstCount":0,"clusterMode":false}]
有参数额外项热点规则示例
[{"resource":"getNoParam2","durationInSec":1,"grade":1,"paramIdx":0,"count":1,"controlBehavior":0,"burstCount":0,"clusterMode":false,"paramFlowItemList":[{"classType":"java.lang.String","count":10,"object":"ftc"}]}]
authority(授权规则)
授权规则具体可参考:com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule
- resource:资源名
- limitApp:请求来源
- strategy:授权策略 0-白名单(默认) 1-黑名单
白名单规则示例
[{"resource":"getById","limitApp":"ftc","strategy":"0"}]
黑名单规则示例
[{"resource":"getById","limitApp":"ftc","strategy":"1"}]

