Sentinel Dashboard 规则联动持久化方案

一、Sentinel Dashboard 规则联动持久化方案

Sentinel 是阿里开源的一个流量控制组件,它提供了一种流量控制、熔断降级、系统负载保护等功能的解决方案。并且我们通过 Sentinel Dashboard 可以非常便捷的添加或修改规则策略,但是如果细心的小伙伴应该可以发现,默认情况下通过 Sentinel Dashboard 添加或修改的规则并没有进行持久化,服务重启后先前的规则也就消失了,这对于生产环境肯定是不允许的,那如何进行持久化操作呢?

Sentinel 官方已经提供了几种持久化方案,比如可以将规则存放在 Nacos、Redis、ZK、Apollo 等等,但是这些操作都没有和 Sentinel Dashboard 做联动,我们需要手动编写规则,如 json 格式,存放在持久化引擎中。

这里我以 Nacos 为例,通过添加 sentinel-datasource-nacos 依赖可以将配置持久化到 Nacos 配置引擎中:

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

比如我们将如下配置在 Nacos 中:

[{"resource": "mylimit","controlBehavior": 0,"count": 1.0,"grade": 1,"limitApp": "default","strategy": 0}
]

在这里插入图片描述

此时可以在 Sentinel Dashboard 中看到该规则:

在这里插入图片描述

但是返回来在 Sentinel Dashboard 添加或修改的规则并没有反向持久化到 Nacos 中,并且随着服务的重启修改的规则会丢失。

在这里插入图片描述

在这里插入图片描述

因此解决上述问题,可以从两个方向入手,一个是拉模式、一个是推模式:

  • 拉模式:通过 sentinel-datasource-extension 包,扩展读数据源RefreshableDataSource,定期扫描目标数据源,比如服务器下的某个文件,如果发生变动便加载到内存中。以及写数据源 WritableDataSource ,当在 Sentinel Dashboard 中变动规则时 ,由服务同步将规则持久化到数据源中。

在这里插入图片描述

  • 推模式:服务通过监有事件通知能力的目标数据源,如 nacos、redis、zk、Apollo 等,当目标数据源中的规则发生变动时,通过事件监听通知服务更新规则,而 Sentinel Dashboard 则不直接将规则发往服务,而是主动持久化到目标数据源中。这种方式需要修改 Sentinel Dashboard 的源码,将原先的通知逻辑修改为存储到目标数据源。

在这里插入图片描述

两种方式都有各自的优缺点,例如 拉模式 下,如果主动改动数据源的数据,需要等到下次扫描时才能生效,而 推模式 由于采用事件监听的方式,可以保证修改的实时性。但是 拉模式 下无需修改源码,在官方提供的依赖基础上就可以实现,而推模式 需要根据源码定制化开发需求。

下面一起实践下两种方案。

为了方便后续的测试,这里提前创建一个接口,指定资源名称为 r1

@RestController
@RequestMapping("/test")
public class TestController {@SentinelResource(value = "r1",blockHandler = "blockHandler")@GetMapping("/t1")public String t1(){return "success";}public String blockHandler(BlockException exception){return "降级了!!!!";}}

二、拉模式

首先需要引入 sentinel-datasource-extension 依赖:

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-extension</artifactId>
</dependency>

这里使用本地文件的方式存储规则,也是 extension 依赖中已经实现好的方式,如果需要存储到其他数据源中,可以模仿 FileRefreshableDataSource 以及 FileWritableDataSource 进行修改。并且还需要实现 InitFunc接口,在init方法中指定DataSource初始化逻辑,并利用spi机制实现加载。

对于规则 Sentinel 中有多种类型,这里实现了 流量、熔断、权限、系统 四个方面的规则持久化:

public class FileDataSourceInit implements InitFunc {/*** 规则文件*/private static final String RULE_FILE_PATH = System.getProperty("user.dir") + File.separator;private static final String FLOW_RULE_FILE_NAME = "FlowRule.json";private static final String DEGRADE_RULE_FILE_NAME = "DegradeRule.json";private static final String AUTHORITY_RULE_FILE_NAME = "AuthorityRule.json";private static final String SYSTEM_RULE_FILE_NAME = "SystemRule.json";@Overridepublic void init() throws Exception {disposeRules();}private void disposeRules() throws FileNotFoundException {String flowRuleFilePath = RULE_FILE_PATH + FLOW_RULE_FILE_NAME;String degradeRuleFilePath = DEGRADE_RULE_FILE_NAME + FLOW_RULE_FILE_NAME;String authorityRuleFilePath = AUTHORITY_RULE_FILE_NAME + FLOW_RULE_FILE_NAME;String systemRuleFilePath = SYSTEM_RULE_FILE_NAME + FLOW_RULE_FILE_NAME;FileRefreshableDataSource<List<FlowRule>> flowRuleRead = new FileRefreshableDataSource<>(flowRuleFilePath, source -> JSON.parseObject((String) source,new TypeReference<List<FlowRule>>() {}));FileRefreshableDataSource<List<DegradeRule>> degradeRuleRead = new FileRefreshableDataSource<>(degradeRuleFilePath, source -> JSON.parseObject((String) source,new TypeReference<List<DegradeRule>>() {}));FileRefreshableDataSource<List<AuthorityRule>> authorityRuleRead = new FileRefreshableDataSource<>(authorityRuleFilePath, source -> JSON.parseObject((String) source,new TypeReference<List<AuthorityRule>>() {}));FileRefreshableDataSource<List<SystemRule>> systemRuleRead = new FileRefreshableDataSource<>(systemRuleFilePath, source -> JSON.parseObject((String) source,new TypeReference<List<SystemRule>>() {}));FlowRuleManager.register2Property(flowRuleRead.getProperty());DegradeRuleManager.register2Property(degradeRuleRead.getProperty());SystemRuleManager.register2Property(systemRuleRead.getProperty());AuthorityRuleManager.register2Property(authorityRuleRead.getProperty());WritableDataSource<List<FlowRule>> flowRuleData = new FileWritableDataSource<>(flowRuleFilePath, this::encodeJson);WritableDataSource<List<DegradeRule>> degradeRuleData = new FileWritableDataSource<>(degradeRuleFilePath, this::encodeJson);WritableDataSource<List<AuthorityRule>> authorityRuleData = new FileWritableDataSource<>(authorityRuleFilePath, this::encodeJson);WritableDataSource<List<SystemRule>> systemRuleData = new FileWritableDataSource<>(systemRuleFilePath, this::encodeJson);WritableDataSourceRegistry.registerFlowDataSource(flowRuleData);WritableDataSourceRegistry.registerDegradeDataSource(degradeRuleData);WritableDataSourceRegistry.registerSystemDataSource(systemRuleData);WritableDataSourceRegistry.registerAuthorityDataSource(authorityRuleData);}private <T> String encodeJson(T t) {return JSON.toJSONString(t);}}

然后在 resources 下,创建 META-INF.services 包,然后在该包下新建 com.alibaba.csp.sentinel.init.InitFunc 文件,文件的内容就是上面类的完整包名地址:

在这里插入图片描述

然后启动项目,在 Sentinel Dashboard 中添加一个规则:

在这里插入图片描述

可以在项目根目录发现已经创建了 FlowRule.json 文件,并且存储的内容就是 JSON 格式的规则信息:

在这里插入图片描述

如果此时将服务重启,再次查看 Sentinel Dashboard 可以发现原有的规则依然存在。

并且多次访问 t1 测试接口,可以看到规则依然有效:

在这里插入图片描述

三、推模式

推模式下可以通过事件监听更及时的通知到目标服务,这里采用 Nacos 作为目标数据源进行实验。上面实验拉模式可以感觉出 Sentinel 不同类型的规则是单独控制的,这里为了方便演示,以流量规则的修改为例进行实践。

同时做好Nacos中配置文件名的约定为 {application name}-sentinel-{type},例如:这里的实验项目名称为 sentinel-demo 的流量规则的名字为:sentinel-demo-sentinel-flow

Nacos 中创建目标配置:

在这里插入图片描述

然后在目标服务中配置flow规则指向该配置:

在这里插入图片描述

上面提到推模式需要修改源码,这里先将 Sentinel 的源码拉取下来:

git clone https://github.com/alibaba/Sentinel.git

使用 IDEA 打开项目,其中 sentinel-dashboard 就是下面我们需要修改的项目:

在这里插入图片描述

Sentinel1.4.0开始,sentinel-dashboard项目就提供了 DynamicRulePublisherDynamicRuleProvider 两个接口用于实现自定义的规则推送和拉取操作,因此我们后续的操作也是基于这两个接口:

在这里插入图片描述

首先在该项目中加入 nacos-client 的依赖:

<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>1.4.2</version>
</dependency>

先实现一个 RuleNacosConfig 类,用来定义和 Nacos 的约定信息,以及声明出 ConfigService

@Configuration
public class RuleNacosConfig {/*** Nacos 配置所在组*/public static final String GROUP_ID = "DEFAULT_GROUP";/*** Nacos 流量规则的名称后缀*/public static final String FLOW_DATA_ID_POSTFIX = "-sentinel-flow";/***  Nacos 信息, 最好读取配置信息,这里演示,先写死*/@Beanpublic ConfigService nacosConfigService() throws Exception {return ConfigFactory.createConfigService("127.0.0.1:8848");}
}

实现 DynamicRuleProvider ,根据不同的服务从 Nacos 中拉取配置:

@Component("flowRuleNacosProvider")
public class FlowRuleNacosProvider implements DynamicRuleProvider<List<FlowRuleEntity>> {@Autowiredprivate ConfigService configService;@Overridepublic List<FlowRuleEntity> getRules(String appName) throws Exception {String rules = configService.getConfig(appName + RuleNacosConfig.FLOW_DATA_ID_POSTFIX,RuleNacosConfig.GROUP_ID, 3000);if (StringUtil.isEmpty(rules)) {return new ArrayList<>();}return JSON.parseArray(rules, FlowRuleEntity.class);}
}

然后实现 DynamicRulePublisher ,将修改后的规则持久化到 Nacos

@Component("flowRuleNacosPublisher")
public class FlowRuleNacosPublisher implements DynamicRulePublisher<List<FlowRuleEntity>> {@Autowiredprivate ConfigService configService;@Overridepublic void publish(String app, List<FlowRuleEntity> rules) throws Exception {if (StringUtils.isBlank(app)) {throw new RuntimeException("Server app is null!");}if (rules == null) {return;}configService.publishConfig(app + RuleNacosConfig.FLOW_DATA_ID_POSTFIX,RuleNacosConfig.GROUP_ID, JSON.toJSONString(rules));}
}

接着修改 com.alibaba.csp.sentinel.dashboard.controller.FlowControllerV1 类,先将上面创建的 FlowRuleNacosProviderFlowRuleNacosPublisher 注入进来:

在这里插入图片描述

下面需要修改 /rules/rule 两个接口,使用上面我们自定义逻辑,首先在 /rules 接口中,注释掉原来的 sentinelApiClient.fetchFlowRuleOfMachine ,替换成:

List<FlowRuleEntity> rules = flowRuleNacosProvider.getRules(app);

在这里插入图片描述

然后在 /rule 接口,注释掉 publishRules 方法的调用,换成:

flowRuleNacosPublisher.publish(entity.getApp(), repository.findAllByApp(entity.getApp()));

在这里插入图片描述

停止掉原有的 Sentinel Dashboard 控制台服务,然后本地启动新的 Sentinel Dashboard 服务,或者打包成 jar 包后启动 。

浏览器访问新的 Sentinel Dashboard 控制台。

这里测试增加一个流控规则:

在这里插入图片描述

下面查看 Nacos 中对应的配置内容:

在这里插入图片描述

已经主动持久化到 Nacos 中了,并且多次访问测试接口,规则也依然生效:

在这里插入图片描述

到此整个修改过程就结束了,虽然上面仅针对流量控制进行了整合,其他模式也是一样的处理方式,有兴趣的小伙伴可以继续补充完善。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/841382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins、GitLab部署项目

1、安装JDK 1.1、下载openJdk11 yum -y install fontconfig java-11-openjdk1.2、查看安装的版本号 java -version1.3、配置环境变量 vim /etc/profile在最底部添加即可 export JAVA_HOME/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 export PATH$JAVA_HOME/…

经典链表题-链表回文结构

&#x1f389;&#x1f389;&#x1f389;欢迎莅临我的博客空间&#xff0c;我是池央&#xff0c;一个对C和数据结构怀有无限热忱的探索者。&#x1f64c; &#x1f338;&#x1f338;&#x1f338;这里是我分享C/C编程、数据结构应用的乐园✨ &#x1f388;&#x1f388;&…

神经网络的工程基础(一)——利用PyTorch实现梯度下降法

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文涉及到的代码链接如下&#xff1a;regression2chatgpt/ch06_optimizer/gradient_descent.ipynb 本文将讨论利用PyTorch实现…

BFS 解决最短路问题

目录 一、前言 1.1 如何使用 BFS 找到最短路&#xff1a; 1.2 为什么不用 dfs &#xff1a; 二、模板套路 三、例题练习 3.1 例题1&#xff1a;迷宫中离入口最近的出口 3.2 例题2&#xff1a;最小基因变化 3.3 例题3&#xff1a;单词接龙 3.4 例题4&#xff1a;为高尔…

HTML橙色爱心

目录 写在前面 准备开始 完整代码 运行结果 系列文章 写在后面 写在前面 本期小编给大家分享一颗热烈且浪漫的爱心&#xff0c;快来看看吧&#xff01; 准备开始 在开始之前&#xff0c;我们需要先简单的了解一下这颗爱心的原理哦~ 本期将用html实现这颗跳动的爱心&a…

YOLOv9改进策略 | 图像去雾 | 利用图像去雾网络UnfogNet辅助YOLOv9进行图像去雾检测(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是利用UnfogNet超轻量化图像去雾网络,我将该网络结合YOLOv9针对图像进行去雾检测(也适用于一些模糊场景),我将该网络结构和YOLOv9的网络进行结合同时该网络的结构的参数量非常的小,我们将其添加到模型里增加的计算量和参数量基本可…

跨平台之用VisualStudio开发APK嵌入OpenCV(二)

开始干 新建解决方案&#xff0c;新建动态库&#xff08;Android&#xff09;项目 功能随便选一个吧&#xff0c;就模仿PS&#xff08;Photoshop&#xff09;的透视裁切功能&#xff0c;一个物体&#xff08;比如扑克牌&#xff09;透视图&#xff0c;选4个顶点&#xff0c;转…

python文件处理之os模块和shutil模块

目录 1.os模块 os.path.exists(path)&#xff1a;文件或者目录存在与否判断 os.path.isfile(path)&#xff1a;判断是否是文件 os.path.isdir(path)&#xff1a;判断是否是文件夹 os.remove(path)&#xff1a;尝试删除文件 os.rmdir(path)&#xff1a;尝试删除目录 os.m…

vue项目elementui刷新页面弹窗问题

bug&#xff1a;每次刷新页面都有这个鬼弹窗。 刚开始以为是自己的代码问题&#xff0c;于是我翻遍了每一行代码&#xff0c;硬是没找出问题。 后来在网上找了些资料&#xff0c;原来是引入的问题。 解决方案&#xff1a; 改一下引入方式即可。 错误姿势 import Vue from …

美发店服务预约会员小程序的作用是什么

美发店不同于美容美甲&#xff0c;男女都是必需且年龄层几乎不限&#xff0c;商家在市场拓展时只要方法得当相对比较容易&#xff0c;当今客户适应于线上信息获取、咨询及实际内容开展&#xff0c;商家也需要赋能和提升自身服务效率&#xff0c;合理化管理。 运用【雨科】平台…

2024年【高压电工】新版试题及高压电工找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高压电工新版试题是安全生产模拟考试一点通生成的&#xff0c;高压电工证模拟考试题库是根据高压电工最新版教材汇编出高压电工仿真模拟考试。2024年【高压电工】新版试题及高压电工找解析 1、【单选题】 110KV及以下…

文件批量重命名利器:一键轻松替换文本间内容,高效管理文件不再是难题!

在信息爆炸的时代&#xff0c;我们的电脑中堆积了无数的文件。这些文件可能包含重要的工作资料、珍贵的个人回忆或是各种学习资料。然而&#xff0c;随着文件的不断增多&#xff0c;如何高效地管理和查找这些文件成为了一个头疼的问题。 文件批量改名高手是一款专业的文件管理…

在IDEA中配置servlet(maven配置完成的基础下)

在IDEA中配置servlet&#xff08;maven配置完成的基础下&#xff09; 1.先新建一个项目 2.选择尾巴是webapp的&#xff0c;名称自定义 3.点击高级设置&#xff0c;修改组id 点击创建&#xff0c;等待jar包下载完成。在pom.xml中配置以下 <dependency><groupId>ja…

docker同步bilibili收藏视频到群晖,可配合emby

作者是amtoaer&#xff0c;在github项目地址&#xff1a;https://github.com/amtoaer/bili-sync 有两个版本&#xff0c;1.0和2.0&#xff0c;我使用的是2.0 PS2&#xff1a;2.0和1.0版本目录结构不兼容&#xff0c;所以部署后会全量重新下载视频。 演示&#xff1a; 依然是…

OpenH264 编解码器介绍

思科 思科系统&#xff08;英语&#xff1a;Cisco Systems, Inc.&#xff09;是一间跨国际综合技术企业&#xff0c;总部设于加州硅谷&#xff1b;思科开发、制作和售卖网络硬件、软件、通信设备等高科技产品及服务&#xff0c;并透过子公司&#xff08;例子有OpenDNS、Webex、…

国赛练习(1)

Unzip 软连接 软连接是linux中一个常用命令&#xff0c;它的功能是为某一个文件在另外一个位置建立一个同步的链接。换句话说&#xff0c;也可以理解成Windows中的快捷方式 注意&#xff1a;在创建软连接的文件的所有目录下不能有重名的文件 打开环境&#xff0c;是文件上传&am…

用实践结果告诉你为啥说 CloudFlare 是赛博菩萨?

最近几天明月都没有更新博客了,主要是接了几个 CloudFlare 代维配置的活儿,有需要加速优化的,有需要排除疑难故障的,有需要提高防御攻击能力的甚至还有纯粹为了体验“打不死”装逼需要的。总之,各种各样的需求,五花八门的,好在 CloudFlare 都能一一满足,最主要的是这些…

Dockerfile使用

1.Dockerfile是什么 官网地址 https://docs.docker.com/reference/dockerfile/概念 是什么 Dockerfile 是用于构建 Docker 镜像的文本文件&#xff0c;它包含一系列的指令&#xff08;instructions&#xff09;和参数&#xff0c;用于描述如何构建和配置镜像。 Dockerfile 是…

解析售后维修服务平台如何助力企业高效运营与决策

随着生活质量的不断提高&#xff0c;人们对于售后服务的要求也越来越多。因此&#xff0c;售后服务已经成为企业竞争力的重要组成部分。售后服务平台作为连接企业与消费者的桥梁&#xff0c;不仅关乎着消费者的满意度&#xff0c;而且直接影响着企业的品牌形象与市场地位。那么…