Edhug

导航

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");// 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中配置什么样的数据
在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 2024-12-28 22:27  饿得慌~  阅读(193)  评论(0)    收藏  举报