快速学习-sentinel动态规则扩展
10、动态规则扩展
10.1 规则
Sentinel 的理念是开发者只需要关注资源的定义,当资源定义成功后可以动态增加各种流控降级规则。Sentinel 提供两种方式修改规则:
- 通过API 直接修改(loadRules)
- 通过DataSource 适配不同数据源修改通过API 修改比较直观,可以通过以下三个API 修改不同的规则:
FlowRuleManager.loadRules(List<FlowRule> rules); // 修改流控规则
DegradeRuleManager.loadRules(List<DegradeRule> rules); // 修改降级规则
SystemRuleManager.loadRules(List<SystemRule> rules); // 修改系统规则
10.2 DataSource 扩展
上述loadRules() 方法只接受内存态的规则对象,但更多时候规则存储在文件、数据库或者配置中心当中。DataSource 接口给我们提供了对接任意配置源的能力。
相比直接通过API 修改规则,实现DataSource 接口是更加可靠的做法。我们推荐通过控制台设置规则后将规则推送到统一的规则中心,客户实现DataSource 接口端监听规则中心实时获取变更,流程如下: DataSource 拓展常见的实现方式有:
- 拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是SQL、文件,甚至是VCS 等。这样做的方式是简单,缺点是无法及时获取变更;
- 推模式:规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证。
10.2.1 拉模式拓展
实现拉模式的数据源最简单的方式是继承AutoRefreshDataSource 抽象类,然后实现readSource() 方法,在该方法里从指定数据源读取字符串格式的配置数据。比如基于文件的数据源。
10.2.2 推模式拓展
实现推模式的数据源最简单的方式是继承AbstractDataSource 抽象类,在其构造方法中添加监听器,并实现readSource() 从指定数据源读取字符串格式的配置数据。比如基于Nacos 的数据源。
10.2.3 注册数据源
通常需要调用以下方法将数据源注册至指定的规则管理器中:
DataSource<String, List<FlowRule>> flowRuleDataSource = new
NacosDataSource<>(remoteAddress, groupId, dataId, parser);
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
若不希望手动注册数据源,可以借助Sentinel 的InitFunc SPI 扩展接口。只需要实现自己的InitFunc 接口,在init 方法中编写注册数据源的逻辑。比如:
package com.test.init;
public class DataSourceInitFunc implements InitFunc {
@Override
public void init() throws Exception {
final String remoteAddress = "localhost";
final String groupId = "Sentinel:Demo";
final String dataId = "com.alibaba.csp.sentinel.demo.flow.rule";
DataSource<String, List<FlowRule>> flowRuleDataSource = new
NacosDataSource<>(remoteAddress, groupId, dataId,
source -> JSON.parseObject(source, new
TypeReference<List<FlowRule>>() {}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
}
}
接着将对应的类名添加到位于资源目录(通常是resource 目录)下的META-INF/services
目录下的com.alibaba.csp.sentinel.init.InitFunc
文件中,比如:com.test.init.DataSourceInitFunc
这样,当初次访问任意资源的时候,Sentinel 就可以自动去注册对应的数据源了。
10.3 示例
10.3.1API 模式:使用客户端规则API 配置规则
Sentinel Dashboard 通过客户端自带的规则API 来实时查询和更改内存中的规则。 注意: 要使客户端具备规则API,需在客户端引入以下依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentienl-http-simple-transport</artifactId>
<version>x.y.z</version>
</dependency>
10.3.2 拉模式:使用文件配置规则
这个示例展示Sentinel 是如何从文件获取规则信息的。FileRefreshableDataSource
会周期性的读取文件以获取规则,当文件有更新时会及时发现,并将规则更新到内存中。使用时只需添加以下依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-extension</artifactId>
<version>x.y.z</version>
</dependency>
10.3.3 推模式:使用Nacos 配置规则
Nacos 是阿里中间件团队开源的服务发现和动态配置中心。Sentinel 针对Nacos 作了适配,底层可以采用Nacos 作为规则配置数据源。使用时只需添加以下依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>x.y.z</version>
</dependency>
然后创建NacosDataSource 并将其注册至对应的RuleManager 上即可。比如:
// remoteAddress 代表Nacos 服务端的地址
// groupId 和dataId 对应Nacos 中相应配置
DataSource<String, List<FlowRule>> flowRuleDataSource = new
NacosDataSource<>(remoteAddress, groupId, dataId,
source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>()
{}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
详细示例可以参见sentinel-demo-nacos-datasource
。
10.3.4 推模式:使用ZooKeeper 配置规则
Sentinel 针对ZooKeeper 作了相应适配,底层可以采用ZooKeeper 作为规则配置数据源。使用时只需添加以下依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-zookeeper</artifactId>
<version>x.y.z</version>
</dependency>
然后创建ZookeeperDataSource 并将其注册至对应的RuleManager 上即可。比如:
// remoteAddress 代表ZooKeeper 服务端的地址
// path 对应ZK 中的数据路径
DataSource<String, List<FlowRule>> flowRuleDataSource = new
ZookeeperDataSource<>(remoteAddress, path, source -> JSON.parseObject(source,
new TypeReference<List<FlowRule>>() {}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
详细示例可以参见sentinel-demo-zookeeper-datasource
。
10.3.5 推模式:使用Apollo 配置规则
Sentinel 针对Apollo 作了相应适配,底层可以采用Apollo 作为规则配置数据源。使用时只需添加以下依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-apollo</artifactId>
<version>x.y.z</version>
</dependency>
然后创建ApolloDataSource 并将其注册至对应的RuleManager 上即可。比如:
// namespaceName 对应Apollo 的命名空间名称
// ruleKey 对应规则存储的key
// defaultRules 对应连接不上Apollo 时的默认规则
DataSource<String, List<FlowRule>> flowRuleDataSource = new
ApolloDataSource<>(namespaceName, ruleKey, defaultRules, source ->
JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
详细示例可以参见sentinel-demo-apollo-datasource
。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- pip install时timeout设置
- 聊聊dubbo-go的TpsLimitFilter
- 聊聊dubbo-go的TokenFilter
- 你这磨人的小妖精——选中文本并标注的实现过程
- VUE跨页面传值的精妙
- 一文解决如何提取TCGA配对表达矩阵
- CSS中的伪类选择器、颜色、度量单位、文本字体及文本样式设置
- CSS盒模型、边框和背景、表格和列表、颜色和透明度、阴影和轮廓及长度单位rem
- C++核心准则CP.110:不要自已为初始化编写双重检查锁定代码
- BOSS直聘招聘信息获取之爬虫程序数据处理
- BOSS直聘招聘信息获取之爬虫程序分析
- 历时4个多月,学习了这 66 个CSS 特效
- ArrayList、LinkedList哪家强,据说90%人都不知道
- Windows创建克隆隐藏账号
- 学员分享-aspera踩坑记录