Sentinel动态数据源架构设计理念与改造实践是怎么样的

技术Sentinel动态数据源架构设计理念与改造实践是怎么样的今天就跟大家聊聊有关Sentinel动态数据源架构设计理念与改造实践是怎么样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根

今天想和大家聊聊Sentinel动态数据源架构的设计理念和转型实践,可能很多人都不太了解。为了让你更好地理解,边肖为你总结了以下内容,希望你能从这篇文章中有所收获。

在引入集群限流之前,需要掌握动态数据源的配置方式,根据Sentinel提供的官方代码提出整体架构思路,最后给出实际指导。

Tips:本文主要分为三个部分:动态数据源架构设计理念,从官方实例中寻找转换思路,基于SpringBoot转换方案详细分析Sentienl NL动态数据源的转换方案,既解决了问题本身,又体现了作者研究一个问题的思路和方法。

1、架构设计理念

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

1)管理后台。

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

Sentinel动态数据源架构设计理念与改造实践是怎么样的

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

数据容器

数据容器是指存储保险丝、限流等规则配置的数据库,如关系数据库、Zookeeper等。在实际生产过程中,需要选择支持持久化功能的数据库,否则程序一重启,配置规则就会丢失,这显然是不可接受的。

动态的

“动态”一词主要强调配置规则的变化可以动态及时生效,引入Sentinel限流SDK的应用可以动态感知配置规则的变化,无需重启即可立即生效。哨兵目前支持阿波罗、执政官、etcd、nacos、redis、spring-clould-config、zookeeper等。

3)应用。

如果想通过Sentinel提供的限流熔断功能来保护应用,需要参考Sentinel的相关SDK,根据收集到的调用信息判断是否符合限流规则。

后台管理系统、动态数据源和应用程序之间的关系如下:

Sentinel动态数据源架构设计理念与改造实践是怎么样的

00-10,从官方文档中可以清楚的知道,官方后台管理系统sentinel-dashboard只支持在内存中存储限流、熔断等限流配置规则,一旦后台管理系统重启,所有配置的熔断规则都会丢失,因此在生产实践中需要对sentinel-dashboard进行一定程度的修改,并引入Zookeeper等动态数据源持久存储限流配置。

有了以上的架构设计理念,为我们的转型提供了方向,那么具体如何转型呢?首先,让我们看看官方的演示程序。下图显示了官方示例代码:

Sentinel动态数据源架构设计理念与改造实践是怎么样的

接下来,我们将介绍如何基于zookeeper构建Sentinel动态数据源。2.1限流熔断器等定期存放。

先看看ZookeeperConfigSender。这个类的主要功能是将配置写入zookeeper。关键代码截图如下:

Sentinel动态数据源架构设计理念与改造实践是怎么样的

这门课的测试目的很简单。首先,限流规则被持久化到zookeeper中,其作用与sentinel-dashboard一致。因此,这个类给我们的后台管理系统带来了很大的启发,那就是可以通过zookeeper存储哨兵限流规则。从演示示例中,我们可以看到Zookeeper中限流规则的目录结构,路径为/{groupId}/{dat。

aid} ,该节点的 value 值存储 json 字符串,存储所有的限流规则。

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

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

  • groupId 通常为一个独立的应用名称,例如应用的 appId,例如示例中的 provider-demo。

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

 

2.2 客户端动态感知配置

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

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

Sentinel动态数据源架构设计理念与改造实践是怎么样的
 

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

  • 需要调用 FlowRuleManager 的 register2Property 方法将数据源关联的数据注册到 FlowRuleManager 中,方便 Sentinel 内核根据数据源中存储的限流熔断等规则进行工作。

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

Sentinel动态数据源架构设计理念与改造实践是怎么样的
 
即在构建 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中,例如增加流控规则的后台处理入口为:

Sentinel动态数据源架构设计理念与改造实践是怎么样的
 

 

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

Sentinel动态数据源架构设计理念与改造实践是怎么样的
 
这样相关管理人员可以直接在 sentinel-dashboard 中配置限流规则,即按照应用为维度进行存储,每一个应用再按照维度,例如限流、熔断、热点、集群等维度进行配置,每一分类节点的值存储的是所有的配置,使用 [{},{}] 这种JSON格式进行存储。
 

 

3.2 Sentinel 客户端规则加载封装

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

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

Sentinel动态数据源架构设计理念与改造实践是怎么样的
 

其主要关键点如下:

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

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

看完上述内容,你们对Sentinel动态数据源架构设计理念与改造实践是怎么样的有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/39946.html

(0)

相关推荐

  • 2021-2022-1-diocs-TCP/IP和网络编程

    技术2021-2022-1-diocs-TCP/IP和网络编程 2021-2022-1-diocs-TCP/IP和网络编程一、任务详情
    自学教材第13章,提交学习笔记(10分)
    知识点归纳以及自己最有收

    礼包 2021年11月23日
  • 速度单位换算,路程,速度,时间的关系式是什么

    技术速度单位换算,路程,速度,时间的关系式是什么路程速度单位换算,速度,时间的关系式是速度=路程/时间。科学上用速度来表示物体运动的快慢。速度在数值上等于单位时间内通过的路程。速度的计算公式:V=S/t。速度的单位是m/

    生活 2021年10月30日
  • 羊绒衫怎么洗最好,羊绒衫染了用什么方法可以洗掉

    技术羊绒衫怎么洗最好,羊绒衫染了用什么方法可以洗掉清洗羊绒衫前羊绒衫怎么洗最好,先注意羊绒衫的衣标,尤其是衣服的成分,清洗方式,水温及晾干方法,不要因为操作失误,浪费一件衣服。 将洗衣盆内接好清水,水温控制在35度以下,

    生活 2021年10月28日
  • MySql2005的小漏洞是什么

    技术MySql2005的小漏洞是什么本篇文章给大家分享的是有关MySql2005的小漏洞是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。如果在MySql

    攻略 2021年11月16日
  • spark如何分析数据(spark的重要组件以及使用场景)

    技术Spark中的核心概念可视化是怎样的本篇文章为大家展示了Spark中的核心概念可视化是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。对于在分布式系统上背景知识较少的人来

    攻略 2021年12月17日
  • Java处理Exception的方法有哪些

    技术Java处理Exception的方法有哪些这篇文章主要讲解了“Java处理Exception的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java处理Ex

    攻略 2021年11月30日