Sentinel 中的动态规则
1,Sentinel提供两种方式修改规则:
- 通过API直接修改(loadRules)
FlowRuleManager.loadRules(List<FlowRule>rules);// 修改流控规则
DegradeRuleManager.loadRules(List<DegradeRule>rules);// 修政降级规则
- 通过 Datasource 适配不同数据源修改
2,DataSource 扩展- loadRules()方法只接受内存态的规则对象,但更多时候规则存储在文件、数据库或者配置中心当中。
- Datasource 接口给我们提供了对接任意配置源的能力。相比直接通过API修改规则,实现 Datasource接口是更加可靠的做法
参考官方文档:https://sentinelguard.io/zh-cn/docs/dynamic-rule-configuration.html
规则管理的推荐做法
1.推荐通过控制台设置规则后将规则推送到统一的规则中心,客户端实现 ReadableDataSource 接口端监听规则中心实时获取变更
2.Datasource 扩展常见的实现方式有:
拉模式:客户端主动向某个规则管理中心定期轮询拉取规则,这个规则中心可以是 RDBMS、文件,甚至是 VCS 等。这样做的方式
是简单,缺点是无法及时获取变更
推模式(推荐):规则中心统一推送,客户端通过注册监听器的方式时刻监听变化,比如使用 Nacos、Zookeeper 等配置中心。这种方式有更好的实时性和一致性保证
Sentinel支持的数据源
1.拉模式:动态文件数据源、Consul Eureka
2.推模式: ZooKeeper, Redis,Nacos, Apollo,etcd
配置动态数据源以Nacos为例
1,注册数据源选择nacos作为规则数据源,参考: Nacos 数据源。
添加sentinel适配nacos的依赖(hailtaxi-api中添加)
<!-- https://mvnrepository.com/artifact/com.alibaba.csp/sentinel-datasource-nacos -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.8.5</version>
</dependency>
版本要与当前使用的sentinel-core版本对应
2,以流控规则FlowRule为例,创建 NacosDataSource并将其注册至对应的RuleManager上即可,也可参考:sentinel-demo-nacos-datasource。
在FlowConfiguration配置类中添加如下初始执行的方法
@PostConstruct
public void loadMyNamespaceRules() {
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, "192.168.10.30:8848");// server addr
properties.put(PropertyKeyConst.NAMESPACE, "486db17a-2f34-42c0-99ce-7d8fe8ccf516");// namespaceid
ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(
properties,
"SENTINEL_GROUP",//group
"driver-flow-rules",//dataId
source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}) //Converter
);
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
}
3,在nacos中添加规则配置
根据注册数据源时的转换器Converter可知,配置规则信息转换出来的结果是:List
在nacos中创建dataid为driver-flow-rules的配置文件,并添加如下配置
[
{
"resource":"driverInfo",
"grade":1,
"count":2
}
]
"grade":1代表流控模式是qps模式,"count":2表明限流阈值是2,针对的资源是driverInfo
控制台推送规则到数据源(nacos)
1,下载sentinel源码工程
git clone https://github.com/alibaba/Sentinel.git
2,导入到idea,基于tag:1.8.5新打一个分支出来
git checkout -b v1.8.5 1.8.5
3,找到sentinel-dashboard模块,先进行源码预览
先看网页
再看后端controller
针对流控规则管理,先来看FlowControllerV1中的实现,其中包含了获取,添加,修改流控规则的几个api
GET /v1/flow/rules
POST /v1/flow/rule
PUT /v1/flow/save.json
核心涉及到两点:
1,dashboard自身对于规则的存储:提供了RuleRepository接口,且对于各种规则都提供的是InMem基于内存的存储
2,dashboard对于规则的推送和拉取:提供了两个接口,DynamicRuleProvider
并且针对两个接口提供了默认的实现,在实现细节上内部是通过SentinelApiClient[内部基于httpClient]直接从应用端拉取和推送到应用端。但是sentinel在test目录下提供了Nacos、ZooKeeper和Apollo 的推送和拉取规则实现示例,我们拿来修改即可
4,在dashboard模块的pom文件中将sentinel-datasource-nacos依赖范围放开
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<!--<scope>test</scope>-->
</dependency>
标签:推送,数据源,扩展,nacos,sentinel,规则,Sentinel,动态
From: https://www.cnblogs.com/Eduhg/p/18601947