Sentinel 规则持久化到 apollo 配置中心

        Sentinel 规则默认是存储在内存中的,只要服务重启之后对应的规则也会消失,实际的生产中肯定是不允许这种操作,因此 Sentinel 官方推荐在生产架构中使用第三方数据源作为永久存储中心,比如 nacos、apollo、zookeeper。因为这几种数据源都是基于 push 模式,也就是由规则中心统一推送,Sentinel Client 只需通过注册监听器的方式时刻监听变化,并负责获取配置中心推送的配置并更新到本地,这种方式能更好的保证实时性和一致性,并且各个微服务的限流、降级规则都可以永久存储,如下图所示。那么这篇文章我们就介绍下,如何集成 apollo 做配置中心进行规则持久化。

1、准备工作:

        首先我们需要先做下准备工作,部署 Apollo 服务 + 搭建微服务项目并接入Apollo,这部分的内容我们就不单独介绍了,有问题的读者请阅读下Apollo官方文档:https://www.apolloconfig.com/#/zh/development/apollo-development-guide

2、添加依赖:

<!-- sentinel整合apollo进行规则持久化 -->
</dependency>
    <dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-apollo</artifactId>
</dependency>

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

猜你喜欢

转载自blog.csdn.net/a745233700/article/details/122725604