Edehuag

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

Sentinel之动态规则扩展

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");// namespaceidReadableDataSource<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中配置什么样的数据
在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用于拉取规则,DynamicRulePublisher用于推送规则,
并且针对两个接口提供了默认的实现,在实现细节上内部是通过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>

posted on   饿得慌~  阅读(54)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示