Alibaba Sentinel规则持久化-拉模式-手把手教程【基于文件】

文章目录

          • 一、拉模式架构
          • 二、原理简述
          • 三、编写
            • 3.1 加依赖
            • 3.2 写代码
            • 3.3 配置
          • 四、优缺点分析
          • 五、你可能会有的疑问
          • 六、参考文档
          • 七、案例测试
            • 7.1. 添加流控规则
            • 7.2. 服务停止
            • 7.3. 重新启动服务
            • 7.4. 调用接口
            • 7.5. 查看流控规则

本文实现基于拉模式的Alibaba Sentinel规则持久化。

一、拉模式架构

在这里插入图片描述

图片来自官方。
引用自 https://github.com/alibaba/Sentinel/wiki/在生产环境中使用-Sentinel

二、原理简述

FileRefreshableDataSource 定时从指定文件中读取规则JSON文件【图中的本地文件】,如果发现文件发生变化,就更新规则缓存。
FileWritableDataSource 接收控制台规则推送,并根据配置,修改规则JSON文件【图中的本地文件】。

三、编写

修改Spring Cloud Alibaba微服务。

3.1 加依赖
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-extension</artifactId>
</dependency>
3.2 写代码
package com.itmuch.contentcenter.sentinel;import com.alibaba.csp.sentinel.command.handler.ModifyParamFlowRulesCommandHandler;
import com.alibaba.csp.sentinel.datasource.*;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;
import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowRuleManager;
import com.alibaba.csp.sentinel.slots.system.SystemRule;
import com.alibaba.csp.sentinel.slots.system.SystemRuleManager;
import com.alibaba.csp.sentinel.transport.util.WritableDataSourceRegistry;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;import java.io.File;
import java.io.IOException;
import java.util.List;/*** 拉模式规则持久化** @author itmuch.com*/
public class FileDataSourceInit implements InitFunc {@Overridepublic void init() throws Exception {// TIPS: 如果你对这个路径不喜欢,可修改为你喜欢的路径String ruleDir = System.getProperty("user.home") + "/sentinel/rules";String flowRulePath = ruleDir + "/flow-rule.json";String degradeRulePath = ruleDir + "/degrade-rule.json";String systemRulePath = ruleDir + "/system-rule.json";String authorityRulePath = ruleDir + "/authority-rule.json";String paramFlowRulePath = ruleDir + "/param-flow-rule.json";this.mkdirIfNotExits(ruleDir);this.createFileIfNotExits(flowRulePath);this.createFileIfNotExits(degradeRulePath);this.createFileIfNotExits(systemRulePath);this.createFileIfNotExits(authorityRulePath);this.createFileIfNotExits(paramFlowRulePath);// 流控规则ReadableDataSource<String, List<FlowRule>> flowRuleRDS = new FileRefreshableDataSource<>(flowRulePath,flowRuleListParser);// 将可读数据源注册至FlowRuleManager// 这样当规则文件发生变化时,就会更新规则到内存FlowRuleManager.register2Property(flowRuleRDS.getProperty());WritableDataSource<List<FlowRule>> flowRuleWDS = new FileWritableDataSource<>(flowRulePath,this::encodeJson);// 将可写数据源注册至transport模块的WritableDataSourceRegistry中// 这样收到控制台推送的规则时,Sentinel会先更新到内存,然后将规则写入到文件中WritableDataSourceRegistry.registerFlowDataSource(flowRuleWDS);// 降级规则ReadableDataSource<String, List<DegradeRule>> degradeRuleRDS = new FileRefreshableDataSource<>(degradeRulePath,degradeRuleListParser);DegradeRuleManager.register2Property(degradeRuleRDS.getProperty());WritableDataSource<List<DegradeRule>> degradeRuleWDS = new FileWritableDataSource<>(degradeRulePath,this::encodeJson);WritableDataSourceRegistry.registerDegradeDataSource(degradeRuleWDS);// 系统规则ReadableDataSource<String, List<SystemRule>> systemRuleRDS = new FileRefreshableDataSource<>(systemRulePath,systemRuleListParser);SystemRuleManager.register2Property(systemRuleRDS.getProperty());WritableDataSource<List<SystemRule>> systemRuleWDS = new FileWritableDataSource<>(systemRulePath,this::encodeJson);WritableDataSourceRegistry.registerSystemDataSource(systemRuleWDS);// 授权规则ReadableDataSource<String, List<AuthorityRule>> authorityRuleRDS = new FileRefreshableDataSource<>(authorityRulePath,authorityRuleListParser);AuthorityRuleManager.register2Property(authorityRuleRDS.getProperty());WritableDataSource<List<AuthorityRule>> authorityRuleWDS = new FileWritableDataSource<>(authorityRulePath,this::encodeJson);WritableDataSourceRegistry.registerAuthorityDataSource(authorityRuleWDS);// 热点参数规则ReadableDataSource<String, List<ParamFlowRule>> paramFlowRuleRDS = new FileRefreshableDataSource<>(paramFlowRulePath,paramFlowRuleListParser);ParamFlowRuleManager.register2Property(paramFlowRuleRDS.getProperty());WritableDataSource<List<ParamFlowRule>> paramFlowRuleWDS = new FileWritableDataSource<>(paramFlowRulePath,this::encodeJson);ModifyParamFlowRulesCommandHandler.setWritableDataSource(paramFlowRuleWDS);}private Converter<String, List<FlowRule>> flowRuleListParser = source -> JSON.parseObject(source,new TypeReference<List<FlowRule>>() {});private Converter<String, List<DegradeRule>> degradeRuleListParser = source -> JSON.parseObject(source,new TypeReference<List<DegradeRule>>() {});private Converter<String, List<SystemRule>> systemRuleListParser = source -> JSON.parseObject(source,new TypeReference<List<SystemRule>>() {});private Converter<String, List<AuthorityRule>> authorityRuleListParser = source -> JSON.parseObject(source,new TypeReference<List<AuthorityRule>>() {});private Converter<String, List<ParamFlowRule>> paramFlowRuleListParser = source -> JSON.parseObject(source,new TypeReference<List<ParamFlowRule>>() {});private void mkdirIfNotExits(String filePath) throws IOException {File file = new File(filePath);if (!file.exists()) {file.mkdirs();}}private void createFileIfNotExits(String filePath) throws IOException {File file = new File(filePath);if (!file.exists()) {file.createNewFile();}}private <T> String encodeJson(T t) {return JSON.toJSONString(t);}
}
3.3 配置

在项目的 resources/META-INF/services 目录下创建文件,名为 com.alibaba.csp.sentinel.init.InitFunc ,内容为:

# 改成上面FileDataSourceInit的包名类名全路径即可。
com.itmuch.contentcenter.sentinel.FileDataSourceInit

在这里插入图片描述

四、优缺点分析

优点:
简单易懂
没有多余依赖(比如配置中心、缓存等)
缺点:
由于规则是用 FileRefreshableDataSource 定时更新的,所以规则更新会有延迟。如果FileRefreshableDataSource定时时间过大,可能长时间延迟;如果FileRefreshableDataSource过小,又会影响性能;
规则存储在本地文件,如果有一天需要迁移微服务,那么需要把规则文件一起迁移,否则规则会丢失。

五、你可能会有的疑问

Spring Cloud Alibaba不是提供了如下配置了吗?为什么要全部自己写呢?

spring.cloud.sentinel.datasource.ds1.file.file=classpath: degraderule.json
spring.cloud.sentinel.datasource.ds1.file.rule-type=flow#spring.cloud.sentinel.datasource.ds1.file.file=classpath: flowrule.json
#spring.cloud.sentinel.datasource.ds1.file.data-type=custom
#spring.cloud.sentinel.datasource.ds1.file.converter-class=com.alibaba.cloud.examples.JsonFlowRuleListConverter
#spring.cloud.sentinel.datasource.ds1.file.rule-type=flow

关于这个问题,可以参考提的Issuehttps://github.com/alibaba/spring-cloud-alibaba/issues/756):

六、参考文档
https://github.com/alibaba/Sentinel/wiki/在生产环境中使用-Sentinel#pull模式
七、案例测试
7.1. 添加流控规则

簇点链路-流控
在这里插入图片描述

7.2. 服务停止

停止内容中心和Sentinel控制台

7.3. 重新启动服务

重新启动Sentinel控制台和内容中心

7.4. 调用接口

由于Sentinel控制台采用的是懒加载策略,因此,需要请求一次接口,再刷新

http://localhost:8010/shares/1

在这里插入图片描述

7.5. 查看流控规则

刷新Sentinel控制台,查看流控规则
在这里插入图片描述

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

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

相关文章

开发者说:Seata 0.7.0 版本,你 get 'Metrics' 技能了吗?

从用户的视角来感受一个开源项目的成长&#xff0c;是我们推出「开发者说」专栏的初衷&#xff0c;即在开发者进行开源项目选型时&#xff0c;提供更为立体的项目信息。专栏所有内容均来自作者原创/投稿&#xff0c;本文是「开发者说」的第9篇&#xff0c;作者郑扬勇&#xff0…

面试时遇到「看门狗」脖子上挂着「时间轮」,我就问你怕不怕?

来源 | Why技术封图 | CSDN 下载于视觉中国之前写了一篇文章&#xff0c;有一个小节中写到这样一段话&#xff1a;于是就有读者来问了&#xff1a;老哥&#xff0c;看门狗介绍一下呗。面试的时候被问到了&#xff0c;没有回答上来。听到这个问题我脑海里首先浮现出了几个问题&…

海量结构化数据存储技术揭秘:Tablestore存储和索引引擎详解

前言 表格存储Tablestore是阿里云自研的面向海量结构化数据存储的Serverless NoSQL多模型数据库。Tablestore在阿里云官网上有各种文档介绍&#xff0c;也发布了很多场景案例文章&#xff0c;这些文章收录在这个合集中《表格存储Tablestore权威指南》。值得一提的是&#xff0…

JavaScript-数组

数组 Array可以包含任意的数据类型 var arr [1,2,3,4,5,6] arr[0] // 取值 arr[0] 3 // 赋值长度 arr.length arr.length 10 // 长度是可变的注意&#xff1a;假如给arr.length 赋值&#xff0c;数组大小就会发生变化。如果赋值过小&#xff0c;元素就会丢失 获取指定字…

Alibaba Sentinel规则持久化-推模式-手把手教程【基于Nacos】

前面&#xff0c;已经为Sentinel实现了 基于拉模式的规则持久化 &#xff0c;本文来实现基于 推模式的规则持久化。 文章目录一、推模式架构图二、原理简述三、微服务改造3.1. 加依赖3.2. 添加配置四、Sentinel控制台改造五、编译 & 启动六、测试测试1&#xff1a;测试2&am…

现代IM系统中的消息系统架构 - 实现篇

序 消息类场景是表格存储&#xff08;Tablestore&#xff09;主推的方向之一&#xff0c;因其数据存储结构在消息类数据存储上具有天然优势。为了方便用户基于Tablestore为消息类场景建模&#xff0c;Tablestore封装Timeline模型&#xff0c;旨在让用户更快捷的实现消息类场景…

linux 环境 RocketMQ 4.8.0 安装、部署控制台

windows下RocketMQ下载、安装、部署、控制台 https://gblfy.blog.csdn.net/article/details/115734482 文章目录一、软件下载二、启动2.1. Linux/Unix/MacOS安装教程2.2. 验证RocketMQ功能正常&#xff08;可选&#xff09;2.3. 服务停止三、安装可视化插件3.1. github下载3.2.…

数据洪流时代,开发者这样硬核突围!

随着社会信息化的脚步加快&#xff0c;我们每个人无时无刻都在产生数据&#xff1a;刷抖音、聊微信、视频会议、点外卖……拇指轻轻一点击的背后&#xff0c;将引发意想不到的数据洪流&#xff1a;据 IDC 发布《数据时代 2025》的报告显示&#xff0c;全球每年产生的数据将从 2…

机器学习在交通标志检测与精细分类中的应用

导读 数据对于地图来说十分重要&#xff0c;没有数据&#xff0c;就没有地图服务。用户在使用地图服务时&#xff0c;不太会想到数据就像冰山一样&#xff0c;用户可见只是最直接、最显性的产品功能部分&#xff0c;而支撑显性部分所需要的根基&#xff0c;往往更庞大。 地图…

Kubenetes 监控一站式解决方案:阿里云 Prometheus 免费公测

Prometheus是目前企业级云原生应用的首选开源监控工具。作为云原生计算基金会&#xff08;CNCF&#xff09;第二个毕业的项目&#xff08;第一个是Kubernetes&#xff09;&#xff0c;Prometheus对K8s容器环境有很好的原生支持。近日刚刚发布免费公测的阿里云Prometheus&#x…

SpringBoot2.x Nacos RocketMQ 事务消息

需求背景&#xff1a; 现在有内容中心&#xff08;content-center&#xff09;和 用户中心&#xff08;user-center&#xff09;2个微服务&#xff0c;请求内容中心&#xff0c;发送消息给用户中心&#xff0c;完成为指定用户添加积分操作。 文章目录一、准备工作1. 版本对照2.…

阿里云宣布3年再投2000亿

4月20日&#xff0c;阿里云宣布&#xff1a;未来3年再投2000亿&#xff0c;用于云操作系统、服务器、芯片、网络等重大核心技术研发攻坚和面向未来的数据中心建设。 近期&#xff0c;谷歌、美团等相继关闭或收缩云计算业务。在当前经济形势下&#xff0c;阿里云是否会缩减投入&…

JavaScript-Map和Set

ES6新特性 Map var map new Map([[wang, 23],[ht, 22],[test,[1,2,3,yy]],[3,test num]]) // 通过 key获取 value var test1 map.get(test); var num map.get(3); console.log(test1) console.log(num) // 添加新的 键值对 map.set(admin, 123456) console.log(map) // 修…

MaxCompute技术人背后的故事:从ApacheORC到AliORC

2019大数据技术公开课第一季《技术人生专访》来袭&#xff0c;本季将带领开发者们探讨大数据技术&#xff0c;分享不同国家的工作体验。本文整理自阿里巴巴计算平台事业部高级技术专家吴刚的专访&#xff0c;将为大家介绍Apache ORC开源项目、主流的开源列存格式ORC和Parquet的…

JavaScript-Iterable迭代

Iterable ES6新特性 遍历数组 // for of 打印值 &#xff0c; for in 打印下标 var arr [4,5,6] for (const number of arr) {console.log(number) }遍历Map var map new Map([[whl,100],[ht,110],[other,0]]) for (let x of map) {console.log(x)console.log(x[0])consol…

阿里小程序亮相2019上海云峰会:大生态促成许多“小而美”

7月25日下午&#xff0c;在上海世博中心的阿里云峰会上海站上&#xff0c;阿里巴巴小程序繁星计划以展区加开放式论坛形式&#xff0c;与各领域开发者、企业和生态合作伙伴充分交流了小程序一云多端的规划和进展&#xff0c;以及阿里系各端APP向小程序开放的资源和能力。 与会者…

快速验证业务决策,“玩转”用户增长

背景 闲鱼目前已经是国内最大的闲置物品交易平台&#xff0c;每天都有数以千万计的用户过来闲鱼&#xff0c;以C2C交易为主。在闲鱼里面&#xff0c;用户的C2C购物频率其实是很低的&#xff0c;而纯粹地逛商品feed流是一件挺无聊的事情。在业务上做加法&#xff0c;突破闲鱼用…

JavaScript-函数

函数 定义函数 定义方式一 绝对值函数 function abs(x) {if (x>0){return x;}else{return -x;} }一旦执行到return 代表函数结束&#xff0c;返回结果&#xff01; 如果没有执行return&#xff0c;函数执行完也会返回结果&#xff0c;结果就是NaN / undefined 定义方式二…

领航智变时代 2020 NAVIGATE领航者峰会云上起航

4月20日&#xff0c;由紫光集团和旗下新华三集团主办的2020 NAVIGATE领航者峰会首次全面移师线上&#xff0c;盛大启航。本次线上峰会从4月20日到25日持续6天&#xff0c;以“智变”为主题&#xff0c;通过33个专题&#xff0c;超过120场演讲&#xff0c;聚焦探索智能时代的智与…

在阿里,我如何做好技术项目管理?

阿里妹导读&#xff1a;在技术公司、尤其是互联网公司&#xff0c;技术人员作为PM(项目经理)是非常常见的。有些同学得心应手&#xff0c;有条不紊&#xff0c;能得到清晰稳定的预期结果&#xff1b;有些同学则在过程中遇到各种闹心的事&#xff0c;最后不是项目上不了线&#…