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-discover
cloud:
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"
}
]