热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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)


推荐阅读
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 在iOS开发中,基于HTTPS协议的安全网络请求实现至关重要。HTTPS(全称:HyperText Transfer Protocol over Secure Socket Layer)是一种旨在提供安全通信的HTTP扩展,通过SSL/TLS加密技术确保数据传输的安全性和隐私性。本文将详细介绍如何在iOS应用中实现安全的HTTPS网络请求,包括证书验证、SSL握手过程以及常见安全问题的解决方法。 ... [详细]
  • 本文探讨了 Kafka 集群的高效部署与优化策略。首先介绍了 Kafka 的下载与安装步骤,包括从官方网站获取最新版本的压缩包并进行解压。随后详细讨论了集群配置的最佳实践,涵盖节点选择、网络优化和性能调优等方面,旨在提升系统的稳定性和处理能力。此外,还提供了常见的故障排查方法和监控方案,帮助运维人员更好地管理和维护 Kafka 集群。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • 构建基础的字符串队列实现方法
    在探讨如何构建基础的字符串队列实现方法时,我们发现许多开发者在面对这一问题时常常感到困惑。实际上,队列的基本原理非常简单,即遵循先进先出的原则。然而,在具体实现过程中,需要注意的是Java语言中并没有指针的概念,因此需要通过嵌套类来模拟指针,进而构建链表结构。这种实现方式不仅能够有效地管理字符串数据,还能提升代码的可读性和维护性。 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
author-avatar
展翅翱翔512
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有