赞
踩
在上一篇我们介绍了流控和降级熔断这几个概念,并对Sentinel的流控与降级的规则进行了进一步的阐述。但是我们之前在控制台配置的规则,控制台是默认通过API推送至客户端并直接更新到内存中。一旦我们重启应用,这些规则便会消失,所以,接下来就让我们一起来看看如何将这些规则持久化吧。
一般来说,规则的推送有下面三种模式:
推送模式 | 说明 | 优点 | 缺点 |
---|---|---|---|
原始模式 | API 将规则推送至客户端并直接更新到内存中,扩展写数据源 | 简单,无任何依赖 | 不保证一致性;规则保存在内存中,重启即消失。严重不建议用于生产环境 |
Pull 模式 | 扩展写数据源, 客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件 等 | 简单,无任何依赖;规则持久化 | 不保证一致性;实时性不保证,拉取过于频繁也可能会有性能问题。 |
Push 模式 | 扩展读数据源,规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。生产环境下一般采用 push 模式的数据源。 | 规则持久化;一致性;快速 | 引入第三方依赖 |
前面两种模式不是我们的重点,这里不再做赘述,感兴趣的同学可以自行查阅官网
生产环境下一般更常用的是 push 模式的数据源。对于 push 模式的数据源,如远程配置中心(ZooKeeper, Nacos, Apollo等等),推送的操作不应由 Sentinel 客户端进行,而应该经控制台统一进行管理,直接进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。因此推送规则正确做法应该是 配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel,而不是经 Sentinel 数据源推送至配置中心。这样的流程就非常清晰了:
Sentinel对Nacos做了适配,这让我们很容易集成Nacos作为数据源进行配置,接下来我们就以Nacos为例来演示一下如何对Sentinel的规则进行持久化
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.8.3</version>
</dependency>
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
[
{
"resource": "test",
"limitApp": "default",
"grade": 1,
"count": 2,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
[
{
"resource": "getUser",
"count": 20.0,
"grade": 0,
"passCount": 0,
"timeWindow": 10
}
]
我们可以看到,刚才在Nacos中添加的流控和降级规则已经在控制台中生效,我们对接口进行测试
如上图所示,对应的流控规则已经生效
注意,在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 | 是否集群限流 | 否 |
同一个资源可以同时有多个限流规则,检查规则时会依次检查。
我们对应控制台的属性来看:
属性 | 说明 | 默认值 |
---|---|---|
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的规则持久化就介绍到这里啦,感谢大家的观看
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。