作者:展翅翱翔512 | 来源:互联网 | 2023-09-23 14:00
Sentinel规则默认是存储在内存中的,只要服务重启之后对应的规则也会消失,实际的生产中肯定是不允许这种操作,因此Sentinel官方推荐在生产架构中使用第三方数据源作为永久存储
Sentinel 规则默认是存储在内存中的,只要服务重启之后对应的规则也会消失,实际的生产中肯定是不允许这种操作,因此 Sentinel 官方推荐在生产架构中使用第三方数据源作为永久存储中心,比如 nacos、apollo、zookeeper。因为这几种数据源都是基于 push 模式,也就是由规则中心统一推送,Sentinel Client 只需通过注册监听器的方式时刻监听变化,并负责获取配置中心推送的配置并更新到本地,这种方式能更好的保证实时性和一致性,并且各个微服务的限流、降级规则都可以永久存储,如下图所示。那么这篇文章我们就介绍下,如何集成 apollo 做配置中心进行规则持久化。
1、准备工作:
首先我们需要先做下准备工作,部署 Apollo 服务 + 搭建微服务项目并接入Apollo,这部分的内容我们就不单独介绍了,有问题的读者请阅读下Apollo官方文档:https://www.apolloconfig.com/#/zh/development/apollo-development-guide
2、添加依赖:
com.alibaba.csp
sentinel-datasource-apollo
3、添加与 sentinel 规则相关的配置项:
# 项目名
spring.application.name = myApplication
# sentinel + apollo 进行规则持久化,为了方便管理,统一将所有项目的 sentinel 规则存放在 sentinel-rules 的公共NameSpace中
sentinel.datasource.rules.apollo.namespace-name = EDU001.sentinel-rules
# 规则类型:限流
spring.cloud.sentinel.datasource.flow.apollo.ruleType = flow
# 从Apollo公共空间中EDU001.sentinel-rules读取限流规则
spring.cloud.sentinel.datasource.flow.apollo.namespace-name = ${sentinel.datasource.rules.apollo.namespace-name}
# 限流规则的具体内容,具体写法下文会介绍(我们需要再添加一个key为“myApplication-flow-rules”的属性存放具体的限流规则)
spring.cloud.sentinel.datasource.flow.apollo.flowRulesKey = ${spring.application.name}-${spring.cloud.sentinel.datasource.flow.apollo.ruleType}-rules
# 规则类型:熔断降级
spring.cloud.sentinel.datasource.degrade.apollo.ruleType = degrade
# 从Apollo公共空间中EDU001.sentinel-rules读取熔断规则
spring.cloud.sentinel.datasource.degrade.apollo.namespace-name = ${sentinel.datasource.rules.apollo.namespace-name}
# 熔断降级规则的具体内容,具体写法下文会介绍
spring.cloud.sentinel.datasource.degrade.apollo.flowRulesKey = ${spring.application.name}-${spring.cloud.sentinel.datasource.degrade.apollo.rule-ruleType}-rules
上述配置仅仅展示了和持久化相关的一些配置,其他相关的配置代码就不贴了。ruleType 的取值用于区分对应的规则类型,总共七大类型,这里我们配置了限流和熔断规则,其他规则类型的取值在 com.alibaba.cloud.sentinel.datasource.RuleType 这个枚举类中有体现,可以自己尝试配置一下。另外,上述的 key 中的 flow、degrade 的名字可以任意。
4、配置规则的真正内容:
sentinel 规则存放在 apollo 配置中心的方式默认都是 JSON 格式的,那么,如何书写 JSON 格式的规则呢?下面我们就介绍下 Json 数据格式中每个属性的作用,开发中可以照着修改即可,对于一些可选属性不需要的时候也可以删除。
4.1、流控规则:
[
{
// 资源名
"resource": "/test",
// 针对来源,若为 default 则不区分调用来源
"limitApp": "default",
// 限流阈值类型(1:QPS;0:并发线程数)
"grade": 1,
// 阈值
"count": 1,
// 是否是集群模式
"clusterMode": false,
// 流控效果(0:快速失败;1:Warm Up(预热模式);2:排队等待)
"controlBehavior": 0,
// 流控模式(0:直接;1:关联;2:链路)
"strategy": 0,
// 预热时间(秒,预热模式需要此参数)
"warmUpPeriodSec": 10,
// 超时时间(排队等待模式需要此参数)
"maxQueueingTimeMs": 500,
// 关联资源、入口资源(关联、链路模式)
"refResource": "rrr"
}
]
4.2、熔断降级规则:
[
{
// 资源名
"resource": "/test1",
"limitApp": "default",
// 熔断策略(0:慢调用比例,1:异常比率,2:异常计数)
"grade": 0,
// 最大RT、比例阈值、异常数
"count": 200,
// 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)
"slowRatioThreshold": 0.2,
// 最小请求数
"minRequestAmount": 5,
// 当单位统计时长(类中默认1000)
"statIntervalMs": 1000,
// 熔断时长
"timeWindow": 10
}
]
4.3、热点规则:
[
{
// 资源名
"resource": "/test1",
// 限流模式(QPS 模式,不可更改)
"grade": 1,
// 参数索引
"paramIdx": 0,
// 单机阈值
"count": 13,
// 统计窗口时长
"durationInSec": 6,
// 是否集群 默认false
"clusterMode": 默认false,
//
"burstCount": 0,
// 集群模式配置
"clusterConfig": {
//
"fallbackToLocalWhenFail": true,
//
"flowId": 2,
//
"sampleCount": 10,
//
"thresholdType": 0,
//
"windowIntervalMs": 1000
},
// 流控效果(支持快速失败和匀速排队模式)
"controlBehavior": 0,
//
"limitApp": "default",
//
"maxQueueingTimeMs": 0,
// 高级选项
"paramFlowItemList": [
{
// 参数类型
"classType": "int",
// 限流阈值
"count": 222,
// 参数值
"object": "2"
}
]
}
]
4.4、系统规则:
负值表示没有阈值检查,不需要删除参数
[
{
// RT
"avgRt": 1,
// CPU 使用率
"highestCpuUsage": -1,
// LOAD
"highestSystemLoad": -1,
// 线程数
"maxThread": -1,
// 入口 QPS
"qps": -1
}
]
4.5、授权规则:
[
{
// 资源名
"resource": "sentinel_spring_web_context",
// 流控应用
"limitApp": "/test",
// 授权类型(0代表白名单;1代表黑名单。)
"strategy": 0
}
]
至此,我们就完成了 sentinel 规则持久化到 apollo 配置中心了,只需要在 apollo 中添加好规则并发布配置,相关规则就会被推送到对应的 sentinel client 以及 sentinel-dashboard 中了。如果读者想实现 sentinel 规则持久化到 nacos 配置中心,那么可以参考下这篇文章:https://mp.weixin.qq.com/s/Q7Xv8cypQFrrOQhbd9BOXw
但是在 push 模式下,所有规则都只能通过 Nacos 界面或 Apollo 界面来完成修改才能得到持久化存储,而在 Sentinel Dashboard 中修改限流规则虽然可以生效,但是不会被持久化到配置中心。而在这两个配置中心里存储的数据是一个 Json 格式,当存储的规则越来越多,对该 Json 配置的可读性与可维护性会变的越来越差。所以接下来我们将会介绍如何对 sentinel-dashboard 进行改造,实现 Sentinel-Dashboard 与 apollo 规则的相互同步(文章地址:https://blog.csdn.net/a745233700/article/details/122659459)