Sentinel 动态数据源架构设计理念与改造实践

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: Sentinel 动态数据源架构设计理念与改造实践

在介绍集群限流之前需要首先掌握动态数据源的配置方式,本文将根据 Sentinel 官方提供的代码提出整体架构思路,并最终给出实践指导。


温馨提示:本文主要分为动态数据源架构设计理念、从官方示例寻找改造思路、基于SpringBoot改造方案三个部分来详细剖析 Sentienl 动态数据源的改造方案,循序渐进,不仅解决问题本身,更是反映了作者研究一个问题的思路与方法。

1、架构设计理念


在 Sentinel 中主要有如下几个角色:管理后台、限流熔断规则数据源、应用程序。

1)管理后台


管理后台主要用于可视化配置限流规则、熔断规则,其操作界面截图如下:


c9b5476c92fb960dae2c5bd6548f250b.png

2)限流熔断规则数据源


用于存储限流熔断规则的数据容器,在 Sentinel 中对应动态数据源这个概念,动态数据源包含两层含义:


  • 数据容器
    数据容器指的就是存储熔断、限流等规则配置的数据库,例如关系型数据库、Zookeeper等等,在实际生产过程中需要选用支持持久化功能的数据库,否则程序一重启,配置规则就会丢失,显然是不能接受的。
  • 动态
    动态二字主要强调的是配置规则的更改能动态及时生效,引入 Sentinel 限流 SDK 的应用程序在不需要重启的情况下动态感知配置规则发生变化并立即生效。Sentinel 目前对 apollo、consul、etcd、nacos、redis、spring-clould-config、zookeeper 等进行了适配支持。


3)应用程序


希望通过 Sentinel 提供的限流、熔断功能对应用程序加以保护,需要引用 Sentinel 相关的 SDK,根据采集的调用信息判断当前是否符合限流规则。


后台管理系统、动态数据源、应用程序的关系如图所示:


2b106fc8dddefe189f99e8ede3b0da94.png

2、从官方示例寻找改造思路


从官方的文档中可以明确获悉 sentinel-dashboard 即官方自带的后台管理系统只支持将限流、熔断等限流配置规则存储在内存中,一旦后台管理系统重启,配置的熔断规则将全部丢失,所以在生产实践过程中需要对 sentinel-dashboard 进行一定的改造,引入动态数据源,例如 Zookeeper,对限流等配置进行持久化存储。


有了上面的架构设计理念为我们的改造提供了方向,那如何具体改造呢?首先我们来看一下官方提供的 Demo 程序。官方提供的示例代码如下图所示:

d39b31ae13362d0d23a89ddd58696085.png

接下来我们将以 zookeeper 动态数据源来介绍基于 zookeeper 如何构建 Sentinel 动态数据源。


2.1 限流熔断等规则存储


首先查阅一下 ZookeeperConfigSender,该类主要的作用是将配置写入到 zookeeper 中,其关键代码截图如下:

8c3bb1f913648dae9de3d832142a292e.png

这个类的测试目的很简单,先将限流规则持久化到 Zookeeper 中,充当的角色与 sentinel-dashboard 的角色一致,故这个类为我们改造后台管理系统带来很大的启发,即可以通过 zookeeper 存储 sentinel 限流规则,从 demo 示例可以看出限流规则在 zookeeper 中的目录结构,路径为 /{groupId} / {dataid} ,该节点的 value 值存储 json 字符串,存储所有的限流规则。


实践指导,通常基于 zookeeper 的开发,主要是规划好目录结构,关于 Sentinel,我对给出一个初步的目录规划。


在 zookeeper 中创建一个根节点,例如 /sentienl 用来表示限流相关的根目录。

  • groupId 通常为一个独立的应用名称,例如应用的 appId,例如示例中的 provider-demo。
  • dataId 通常为配置类型,例如限流规则、熔断规则、热点规则等类别,例如限流规则使用 /flowRule ,熔断规则使用 /degradeRule,其 value 值使用 json 存储,将该应用下的所有限流规则用一个 json 对象表示,其存储格式类似于 [{},{}]。


2.2 客户端动态感知配置


实现存储规则的配置存储后接下来是需要客户端能动态感知规则的变化,从而是配置规则实时生效。


我们依然先来看一下官方示例,其核心代码如图所示:

3ff13f5983af7b86744991ccd57d77f9.png

这里尽管引入 groupId 与 dataId 的概念是方便与 nacos 进行切换,但就算不切换,基于 zookeeper 的编程,这种目录规划是非常有必要的。上面的示例代码有两个关键点:


  • 创建 ZookeeperDataSource,每一个 ZookeeperDataSource 负责监听一个节点。
  • 需要调用 FlowRuleManager 的 register2Property 方法将数据源关联的数据注册到 FlowRuleManager 中,方便 Sentinel 内核根据数据源中存储的限流熔断等规则进行工作。


客户端在启动的时候会调用 FlowRuleManager 相关方法加载限流相关的配置,那如果配置规则发生变化后,客户端如何动态感知呢?其关键就在于 ZookeeperDataSource 的实现中,其实现关键点如下:

3afc6691115e5bccac4ccc4ea15581e7.png

即在构建 ZookeeperDataSource 时会监听 /groupId/dataId 节点,即存放限流配置的节点,一旦数据发生变化,就会通知到客户端,从而调用 loadConfig 重新更新Sentienl 客户端的限流配置,从而实现配置实时生效。


3、动态数据源实现方案


从官方的示例中我们不难发现,引入 Zookeeper 数据源主要有两个步骤:将数据存储在Zookeeper中以及在客户端监听ZK从而实时生效两个步骤。


sentinel 官方提供了默认的后台管理系统实现:sentinel-dashboard,但其缺点非常明显:基于内存存储,无法用于实际生产过程。大家可能会向后台管理系统将配置信息存储在内存中,那接入的客户端如何从 sentinel-dashboard 的内存中获取配置信息呢,这是因为 sentinel-dashboard 里提供了简单的机器发现,并且内置了 sentinel 客户端之间、sentinel 客户端与 sentinel-dashboard 之间的通讯协议,具体由 sentinel-transport 模块实现,目前提供了基于 http 与 netty 的实现方式,故能将 sentinel-dashboard 内存中的配置信息推送到客户端,从而使客户端根据配置进行限流与熔断。


接下来回答本文的重点部分,基于 sentinel-dashboard 如何引入 zookeeper 等动态数据源呢?


3.1 将配置规则存储在Zookeeper中


首先我们可以顺着 sentinel-dashboard 的提供的控制器,寻找其后台入口,改造目标也很明确,就是将数据持久化到 zookeeper中,例如增加流控规则的后台处理入口为:


d746a0939bc1d3ac49d8679408224dd4.png

只需要从这里开始改造,将其配置持久化到数据库中和 zookeeper中即可。将数据存储在 zookeeper 中,其关键是设计好各个项目如何有组织有条理的在 zookeeper 中进行组织。我给出如下设计方案:

5399f6872af2bbb0a26e26cc9db3984b.png

这样相关管理人员可以直接在 sentinel-dashboard 中配置限流规则,即按照应用为维度进行存储,每一个应用再按照维度,例如限流、熔断、热点、集群等维度进行配置,每一分类节点的值存储的是所有的配置,使用 [{},{}] 这种JSON格式进行存储。


3.2 Sentinel 客户端规则加载封装


目前大部分项目都是基于 SpringBoot,故本文给出基于 SpringBoot 进行的客户端加载实现思路。


利用 SpringBoot 的事件机制,在 Spring 容器初始化后,开始加载 zookeeper 中的配置,其实现思路是读取 zookeeper 中的 /sentinel 下所有的子节点,然后并依次遍历其子节点(appid),然后依次读取 flow(限流)、degrade(熔断)等配置,并调用 Sentinel 的 相关API完成加载,其伪代码如下:

1f8b4d8dd99b93e63c09b2292a2ff5dc.png

其主要关键点如下:


  • 基于 Spring ApplicationReadyEvent 事件,实现限流规则的加载。


  • 创建 ZookeeperDataSource 创建动态数据源。
    并调用 Sentinel 提供的相关 API 完成限流规则的加载。


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
15天前
|
弹性计算 Java 关系型数据库
Web应用上云经典架构实践教学
Web应用上云经典架构实践教学
Web应用上云经典架构实践教学
|
1天前
|
存储 人工智能 运维
面向AI的服务器计算软硬件架构实践和创新
阿里云在新一代通用计算服务器设计中,针对处理器核心数迅速增长(2024年超100核)、超多核心带来的业务和硬件挑战、网络IO与CPU性能增速不匹配、服务器物理机型复杂等问题,推出了磐久F系列通用计算服务器。该系列服务器采用单路设计减少爆炸半径,优化散热支持600瓦TDP,并实现CIPU节点比例灵活配比及部件模块化可插拔设计,提升运维效率和客户响应速度。此外,还介绍了面向AI的服务器架构挑战与软硬件结合创新,包括内存墙问题、板级工程能力挑战以及AI Infra 2.0服务器的开放架构特点。最后,探讨了大模型高效推理中的显存优化和量化压缩技术,旨在降低部署成本并提高系统效率。
|
3天前
|
运维 监控 安全
天财商龙:云上卓越架构治理实践
天财商龙成立于1998年,专注于为餐饮企业提供信息化解决方案,涵盖点餐、收银、供应链和会员系统等。自2013年起逐步实现业务上云,与阿里云合作至今已十年。通过采用阿里云的WA体系,公司在账号管理、安全保障、监控体系和成本管控等方面进行了全面优化,提升了业务稳定性与安全性,并实现了显著的成本节约。未来,公司将持续探索智能化和全球化发展,进一步提升餐饮行业的数字化水平。
|
21小时前
|
负载均衡 Serverless 持续交付
云端问道9期实践教学-省心省钱的云上Serverless高可用架构
详细介绍了云上Serverless高可用架构的一键部署流程
26 10
|
3天前
|
运维 安全 架构师
架构师工具箱:Well-Architected云治理提效实践
本次分享基于阿里云Well-Architected Framework的最佳实践案例,涵盖企业从上云到优化的全过程。安畅作为国内领先的云管理服务提供商(Cloud MSP),拥有800多名员工,其中70%为技术工程师,为企业提供架构安全、数据智能等技术服务。内容包括Landing Zone与Well-Architected的关系、企业云治理现状及需求分析,重点探讨了安全合规、成本优化、资源稳定性和效率提升等方面的最佳实践,并通过具体客户案例展示了如何通过自动化工具和定制化解决方案帮助企业提升云上业务价值。
|
30天前
|
运维 监控 Java
后端开发中的微服务架构实践与挑战####
在数字化转型加速的今天,微服务架构凭借其高度的灵活性、可扩展性和可维护性,成为众多企业后端系统构建的首选方案。本文深入探讨了微服务架构的核心概念、实施步骤、关键技术考量以及面临的主要挑战,旨在为开发者提供一份实用的实践指南。通过案例分析,揭示微服务在实际项目中的应用效果,并针对常见问题提出解决策略,帮助读者更好地理解和应对微服务架构带来的复杂性与机遇。 ####
|
30天前
|
算法 NoSQL Java
微服务架构下的接口限流策略与实践#### 一、
本文旨在探讨微服务架构下,面对高并发请求时如何有效实施接口限流策略,以保障系统稳定性和服务质量。不同于传统的摘要概述,本文将从实际应用场景出发,深入剖析几种主流的限流算法(如令牌桶、漏桶及固定窗口计数器等),通过对比分析它们的优缺点,并结合具体案例,展示如何在Spring Cloud Gateway中集成自定义限流方案,实现动态限流规则调整,为读者提供一套可落地的实践指南。 #### 二、
55 3
|
29天前
|
消息中间件 运维 安全
后端开发中的微服务架构实践与挑战####
在数字化转型的浪潮中,微服务架构凭借其高度的灵活性和可扩展性,成为众多企业重构后端系统的首选方案。本文将深入探讨微服务的核心概念、设计原则、关键技术选型及在实际项目实施过程中面临的挑战与解决方案,旨在为开发者提供一套实用的微服务架构落地指南。我们将从理论框架出发,逐步深入至技术细节,最终通过案例分析,揭示如何在复杂业务场景下有效应用微服务,提升系统的整体性能与稳定性。 ####
39 1
|
30天前
|
消息中间件 运维 API
后端开发中的微服务架构实践####
本文深入探讨了微服务架构在后端开发中的应用,从其定义、优势到实际案例分析,全面解析了如何有效实施微服务以提升系统的可维护性、扩展性和灵活性。不同于传统摘要的概述性质,本摘要旨在激发读者对微服务架构深度探索的兴趣,通过提出问题而非直接给出答案的方式,引导读者深入
45 1
|
28天前
|
Cloud Native API 持续交付
云原生架构下的微服务治理策略与实践####
本文旨在探讨云原生环境下微服务架构的治理策略,通过分析当前面临的挑战,提出一系列实用的解决方案。我们将深入讨论如何利用容器化、服务网格(Service Mesh)等先进技术手段,提升微服务系统的可管理性、可扩展性和容错能力。此外,还将分享一些来自一线项目的经验教训,帮助读者更好地理解和应用这些理论到实际工作中去。 ####
40 0

热门文章

最新文章